所以我的理解是除非绝对必要,否则应该避免使用循环和游标。在我的情况下,在我看来,如果我必须依赖它们,我做错了所以我希望社区输入。
我正在编写一个存储过程来将项添加到队列中,添加的项数取决于项类型的间隔设置。将数据插入队列后,我需要将队列项的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是完全顺序的。
思想?
答案 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
中提琴!