2011-05-20 47 views
16

我有一个表项目(项目ID,姓名,...)其中的ItemID是自动生成的身份T-SQL:在OUTPUT子句INSERT原值

我想行添加到这个表从同一张表中选择。 并保存到表变量中OriginalItemID和NewlyGeneratedID之间的引用。

所以我希望它看起来像下面这样:

DECLARE @ID2ID TABLE (OldItemID INT, NewItemID INT); 

INSERT INTO Items OUTPUT Items.ItemID, INSERTED.ItemID INTO @ID2ID 
SELECT * FROM Items WHERE Name = 'Cat'; 

Items.ItemID显然不能在这里工作。是否有一种解决方法使OUTPUT从SELECT语句中获取原始ItemID?

+1

你必须有对目标表有点像'OldItemID',你可以用你的“旧”项目ID值填写。另外:如果该ItemID是自动生成的,则应该在** INSERT INTO Items ......中显式指定**列的列表(除Itemid之外的所有内容)以及相应的SELECT (列表列)FROM Items ...'语句。否则,您将选择“旧”自动生成的ItemID值并尝试再次将这些值插入到自动生成的列中 - 这很可能不会起作用 – 2011-05-20 16:39:33

+0

好点。我的例子中有一个错误。无论如何,问题依然存在。 – Evgenyt 2011-05-22 15:16:51

回答

19

如果您使用的是SQL Server 2008+,则可以使用MERGE来获取当前ID和新ID。该技术在this question中描述。

对于你的榜样的声明可能是这样的:

MERGE Items AS t 
USING (
    SELECT * 
    FROM Items 
    WHERE Name = 'Cat' 
) AS s 
ON 0 = 1 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (target_column_list) VALUES (source_column_list) 
OUTPUT INSERTED.ItemID, S.ItemID INTO @ID2ID (OldItemID, NewItemID);