[英]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.