2011-05-20 27 views
16

Bir tablo Ürünleri var (ItemID, Ad ...) Bu tabloya satır eklemek istediğiniz otomatik oluşturulan kimlikT-SQL: OUTPUT yan tümcesinde orijinal değerini INSERT

ItemID olduğunu FROM bu aynı masada seçin. VE OriginalItemID ve NewlyGeneratedID arasındaki başvuruları tablo değişkenine kaydedin.

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

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

ANCAK Items.ItemID besbelli burada çalışmıyor:

Bu yüzden aşağıdaki gibi bakmak istiyorum. OUTPUT'un SELECT ifadesinden orijinal ItemID'yi alması için bir çözüm var mı?

+1

: En Örneğin deyimi aşağıdaki gibi görünebilir için

. Ayrıca: eğer o ItemID otomatik olarak üretilirse, ** her iki "INSERT INTO Items ......" inizin yanı sıra karşılık gelen 'SELECT'inde ** sütunların listesini (ItemID' hariç her şey) açıkça belirtmeniz gerekir. Öğelerden FROM ... 'ifadeleri. Aksi takdirde, "eski" otomatik olarak oluşturulmuş ItemID değerlerini seçecek ve bunları otomatik olarak oluşturulan sütuna eklemeye başlayacaksınız. Bu, büyük olasılıkla –

+0

İyi nokta bile çalışmayacaktır. Örneğimde bir hata var. Her neyse sorun devam ediyor. – Evgenyt

cevap

19

SQL Server 2008+ kullanıyorsanız, hem geçerli hem de yeni kimliği almak için MERGE'u kullanabilirsiniz. Teknik, this question'da açıklanmaktadır. Size "eski" ItemID değerle doldurabilirsiniz hedef masaya `OldItemID` böyle bir şey var olurdu

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); 
İlgili konular