【发布时间】:2012-03-05 16:13:24
【问题描述】:
我有一个表,我需要将记录从该表复制回自身。作为其中的一部分,我想使用 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 添加一列,我可以看到这会如何工作,但这不是一个选项。以前,这是使用导致性能瓶颈的游标实现的——我故意试图避免这种情况。
如何在保留复制行的键的同时复制这些记录以实现尽可能高的性能?
【问题讨论】:
-
正如您所提到的,最简单的方法是使用一个额外的列来容纳旧 ID。添加列不是选项的原因是什么?
-
是的,我认为您是对的,但该列在此复制操作之外没有意义——如果没有其他结果,我想我并不完全反对。跨度>
-
这并不像你说的那样理想,因为它并不是真正的数据的一部分。我想您可以将列添加为过程的一部分,然后将其删除,但这似乎有点笨拙。我很想使它可以为空,并确保在使用后将列清空以节省空间(假设您不需要在过程之外保留旧的 ID 值)
-
如果您使用的是 SQL Server 2008,则可以使用
merge。 stackoverflow.com/questions/5365629/… -
@Mikael Eriksson 是的,我希望能够使用 MERGE。
标签: sql-server performance sql-server-2005 insert output-clause