繁体   English   中英

在SQL Server 2005中使用OUTPUT INTO复制表行

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM