2011-05-20 48 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);