[英]Copy table rows using OUTPUT INTO in SQL Server 2005
我有一個表,我需要將記錄從表復制回自身。 作為其中的一部分,我想使用OUTPUT子句將新行捕獲到表變量中,以便我可以在同一過程中對行執行其他操作。 我希望每一行都包含其新密鑰和從中復制的密鑰 。 這是一個人為的示例:
INSERT
MyTable (myText1, myText2) -- myId is an IDENTITY column
OUTPUT
Inserted.myId,
Inserted.myText1,
Inserted.myText2
INTO
-- How do I get previousId into this table variable AND the newly inserted ID?
@MyTable
SELECT
-- MyTable.myId AS previousId,
MyTable.myText1,
MyTable.myText2
FROM
MyTable
WHERE
...
如果INSERT上的列數與SELECT語句中的列數不匹配,則SQL Server會發出吠聲。 因此,如果將列添加到MyTable中,我可以看到它如何工作,但這不是一個選擇。 以前,這是通過游標實現的,這會導致性能瓶頸-我有意避免這種情況。
如何在保留復制行的鍵的同時復制這些記錄,以實現最高的性能?
我不清楚上下文-這是在AFTER INSERT觸發器中。
無論如何,我看不出有任何方法可以在一個電話中做到這一點。 OUTPUT子句僅允許您返回已插入的行。 我建議如下:
DECLARE @MyTable (
myID INT,
previousID INT,
myText1 VARCHAR(20),
myText2 VARCHAR(20)
)
INSERT @MyTable (previousID, myText1, myText2)
SELECT myID, myText1, myText2 FROM inserted
INSERT MyTable (myText1, myText2)
SELECT myText1, myText2 FROM inserted
-- @@IDENTITY now points to the last identity value inserted, so...
UPDATE m SET myID = i.newID
FROM @myTable m, (SELECT @@IDENTITY - ROW_NUMBER() OVER(ORDER BY myID DESC) + 1 AS newID, myID FROM inserted) i
WHERE m.previousID = i.myID
...
當然,您不會將其放入AFTER INSERT觸發器中,因為它將給您遞歸調用,但是您可以在INSTEAD OF INSERT觸發器中進行。 我可能在遞歸問題上錯了; 我總是避免遞歸調用,所以我從來沒有真正發現過。 但是,使用@@ IDENTITY和ROW_NUMBER()是我過去幾次使用過的技巧來做類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.