2012-01-10 76 views
0

因此,我的理解是,除非絕對必要,否則應該避免循環和遊標。在我的情況下,在我看來,如果我必須依靠他們,我做錯了,所以我希望社區的意見。SQL存儲過程多插入句柄循環或多個scope_insert值

我正在編寫一個存儲過程以將項目添加到隊列中,添加的項目數量取決於項目類型的間隔設置。一旦數據插入到隊列中,我需要將隊列項的ID添加到其他表中。我遇到了一個問題,因爲我通常依靠SCOPE_IDENTITY()來取回ID。

下面是我的表結構:

CREATE TABLE QueueItem (
    QueueItemID [int] IDENTITY NOT NULL, 
    ReferenceID [int] NOT NULL, 
    StartDate [datetime] NOT NULL 
); 

CREATE TABLE CatalogDate (
    ReferenceID [int] NOT NULL, 
    CatalogID [int] NOT NULL, 
    DayCount [int] NOT NULL 
); 

CREATE TABLE ItemInterval (
    ReferenceID [int] NOT NULL, 
    Interval [int] NOT NULL 
); 


CREATE PROCEDURE SetQueueItem 
    @ReferenceID [int], 
    @UserID [int] 
AS 
BEGIN 

    DECLARE @DayCount [int] 
    DECLARE @CatalogID [int] 
    DECLARE @QueueItemID [int] 

    SELECT @DayCount = DayCount, @CatalogID = CatalogID 
    FROM CatalogDate 
    WHERE ReferenceID = @ReferenceID 

    DECLARE @Date [datetime] = --SELECT Date from another table using @UserID and @CatalogID 

    DECLARE @StartDate [datetime] = (SELECT DATEADD(dd, @DayCount, @Date)) 

    INSERT INTO QueueItem(ReferenceID, StartDate) 
    SELECT @ReferenceID, DATEADD(@DateCount-Interval), @Date) 
    FROM ItemInterval 
    WHERE ReferenceID = @ReferenceID --SELECT RETURNS MULTIPLE ROWS 

現在,一旦多個記錄的插入已經完成我需要從插件中生成的QueueItemID的,並與一些額外數據一起將它們插入另外兩張桌子。

的唯一途徑,我可以看到完成這是ItemInterval通過任何分手的INSERT來遍歷每個記錄,並把它們插入一次一個,或之前和插入之後查詢從QueueItemMAX記錄然後在假設ID完全連續的情況下循環顯示差異。

想法?

回答

0

感謝@ StarShip3000的引用上OUTPUT

要使用OUTPUT解決這個問題,我甩了,結果到一個變量表,然後使用該表中插入結果在其他表格中。

DECLARE @QueueItemTable TABLE 
(
    ItemID [int] 
) 

INSERT QueueItem(ReferenceID, StartDate) 
OUTPUT inserted.QueueItemID INTO @QueueItemTable(ItemID) 
SELECT @ReferenceID, DATEADD(@DateCount-Interval), @Date) 
FROM ItemInterval 
WHERE ReferenceID = @ReferenceID --INSERTS IDENTITIES into @QueueItemTable variable 

--Insert into other tables 

INSERT QueueRelationship(QueueItemID) 
SELECT ItemID 
FROM @QueueItemTable 

中提琴!

相關問題