0

特定のレコードを含むテーブルがあります。これを優先度テーブルと呼びましょう。このテーブルの各レコードに対して、 ProductGetProductsBasedOnPriorityRecordテーブルからレコードを返すというストアド プロシージャを実行する必要があります。これらの結果はすべて、重複のない 1 つの UNION として返される必要があります。

次の C# 疑似コードを記述できますが、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;
4

3 に答える 3

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 
于 2013-06-03T16:40:52.527 に答える
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 
于 2013-06-04T05:57:48.077 に答える
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

もちろん、これはあなたのテーブルについていくつかの仮定をします。また、(もちろん)このような合成例は、実際には非常に単純なことを行うための長い道のりを示しています。

于 2013-06-03T16:43:34.420 に答える