2011-09-29 54 views
2

我想我已經知道答案,但...身份從多個插入

鑑於這種說法:

Insert Into Allergy (Name, Category, Composition) 
Select Name, Category, Composition 
From ETVault Where Strain In (6, 2, 4) 

是否有可能得到所插入的身份?

我知道我可以把它分解成多個語句,並在每個語句後捕獲scope_identity(),但這不是我要求的。

+0

可能重複http://stackoverflow.com/questions/4619343/sql-server-list-of-插入器身份) –

回答

1

我認爲這樣做的第一種方法是在表上使用AFTER INSERT TRIGGER,捕獲插入的整個行集,並從那裏獲取身份。

編輯當然,你也可以通過捕捉OUTPUT(DOH)

http://msdn.microsoft.com/en-us/library/ms177564.aspx

這裏是工作示例,因爲你沒有提供的樣本數據做到這一點,我創建了自己防敏感和ETVault表,所以在一個全新的數據庫中使用這個例子。

DROP TABLE Allergy 
GO 
CREATE TABLE Allergy 
(
ID INTEGER IDENTITY (1, 1), NAME VarChar (20), Category VarChar (20), Composition VarChar (20) 
) 
GO 
DROP TABLE ETVault 
Go 
CREATE TABLE ETVault 
(
ID INTEGER IDENTITY (1, 1), Strain INT, NAME VarChar (20), Category VarChar (20), Composition VarChar (20) 
) 
GO 
INSERT INTO dbo.ETVault 
     (Strain, NAME, Category, Composition) 
VALUES 
(1, '1', '1', '1'), 
(2, '1', '1', '1'), 
(3, '1', '1', '1'), 
(4, '1', '1', '1'), 
(5, '1', '1', '1'), 
(6, '1', '1', '1'), 
(7, '1', '1', '1'), 
(8, '1', '1', '1') 

DECLARE @CaptureTable TABLE (ID INT) 


INSERT INTO dbo.Allergy 
     (NAME, Category, Composition) 
OUTPUT INSERTED.Id INTO @CaptureTable 
SELECT dbo.ETVault.NAME, Category, Composition 
FROM dbo.ETVault 
Where Strain In (6, 2, 4) 


SELECT * FROM @CaptureTable 

它給你的輸出

(8 row(s) affected) 

(3 row(s) affected) 
ID 
----------- 
1 
2 
3 

(3 row(s) affected) 
[插入身份的SQL服務器列表(的