因此,我的理解是,除非絕對必要,否則應該避免循環和遊標。在我的情況下,在我看來,如果我必須依靠他們,我做錯了,所以我希望社區的意見。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來遍歷每個記錄,並把它們插入一次一個,或之前和插入之後查詢從QueueItem
表MAX
記錄然後在假設ID完全連續的情況下循環顯示差異。
想法?