2013-06-03 225 views
0

我有一张表有一定的记录,我们称之为优先表。对于此表中的每条记录,我需要执行名为GetProductsBasedOnPriorityRecord的存储过程,该过程从产品表中返回记录。 所有这些结果需要作为一个UNION返回而没有重复。如何为每个执行SP并将所有结果合并?

我能写出下面的C#pseodo代码,但我对如何做到这一点的SQL不知道:

//DECLARE resultVariable 
var products = new List<Product>(); 

//SELECT * FROM Priority and FOREACH over this 
foreach(var prio in Priority) { 
    //EXEC GetProductsBasedOnPriorityRecord and UNION this on the resultVariable 
    products.Union(GetProductsBasedOnPriorityRecord(prio)); 
} 

//RETURN resultVariable 
return products; 
+0

如果这是你想要的吗?请参阅小提琴http://sqlfiddle.com/#!3/23b58/6。或以其他方式提供样本结果行。 –

回答

3

你不应该写在循环SQL代码,如果你需要它表现相对较好。但这是我在这种情况下要做的。

-- build some variables 
declare @prio   table (prio varchar(100) not null) 
declare @singlePrio  varchar(50) 
declare @sqlcmd   varchar(50) 

-- assuming that the output of the stored procedure is just a table of INTs 
declare @output   table (outputID int not null) 

-- build the list to loop over 
insert into @prio (prio) 
select * from [Priority] 

while exists (select 1 from @prio) 
begin 
    select @singlePrio = (select top 1 prio from @prio) 
    -- 
    insert into @output exec GetProductsBasedOnPriorityRecord @singlePrio 
    -- 
    delete from @prio where prio = @singlePrio 
end 

-- using distinct because you want a 'union' but didnt say 'union all' 
select distinct outputID from @output 
1

那么你应该可以用光标来做到这一点。这并不总是最好的方法。我假设你被迫使用现有的存储过程。

实施例表

CREATE TABLE [dbo].[Products](
    [ProductID] [int] IDENTITY(1,1) NOT NULL, 
    [ProductName] [nchar](10) NULL, 
    [PriorityID] [int] NULL) 

CREATE TABLE [dbo].[Priority](
    [PriorityID] [int] IDENTITY(1,1) NOT NULL, 
    [PriorityCode] [nchar](10) NULL) 

(带的PK等)。

示例存储过程:

ALTER PROCEDURE [dbo].[GetProductsBasedOnPriorityRecord] 
    -- Add the parameters for the stored procedure here 
    @PriorityID int = 0 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * FROM Products WHERE PriorityID = @PriorityID 
END 

然后是这样的:

DECLARE @PriorityID INT 
DECLARE @table TABLE (ProductID INT, ProductName NCHAR(10), PriorityID INT) 
DECLARE cur CURSOR FOR SELECT PriorityID FROM Priority 
OPEN cur 
FETCH NEXT FROM cur INTO @PriorityID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO @table EXEC GetProductsBasedOnPriorityRecord @PriorityID 
    FETCH NEXT FROM cur INTO @PriorityID 
END 

CLOSE cur 
DEALLOCATE cur 

SELECT DISTINCT * FROM @table 

当然,这使你的表格一些假设。另外(当然)这样一个合成的例子实际上显示了一种很简单的做法。

1

尝试这一个 -

DECLARE @SQL NVARCHAR(MAX) 

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL 
    DROP TABLE #temp 

CREATE TABLE #temp (outputID INT NOT NULL) 

SELECT @SQL = (
    SELECT CHAR(13) + ' 
     INSERT INTO #temp(outputID) 
     EXEC dbo.GetProductsBasedOnPriorityRecord ''' 
      + prio + '''' 
    FROM dbo.[Priority] 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 

PRINT @SQL 

EXEC sys.sp_executesql @SQL 

SELECT DISTINCT outputID 
FROM #temp 
相关问题