SQL存储过程多插入句柄循环或多个scope_insert值

时间:2012-01-10 22:36:41

标签: sql-server-2008 stored-procedures cursor

所以我的理解是除非绝对必要,否则应该避免使用循环和游标。在我的情况下,在我看来,如果我必须依赖它们,我做错了所以我希望社区输入。

我正在编写一个存储过程来将项添加到队列中,添加的项数取决于项类型的间隔设置。将数据插入队列后,我需要将队列项的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,并将它们与一些附加数据一起插入另外两个表中。

我能看到完成此任务的唯一方法是分解INSERT以遍历ItemInterval中的每个记录并一次插入一个,或查询来自MAX的{​​{1}}条记录在插入之前和之后的QueueItem表,然后循环遍历差异,假设ID是完全顺序的。

思想?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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

中提琴!