2012-10-12 85 views
12

我有一個單一的列,它是一個自動生成的標識的表插入默認值的多個行插入表

create table SingleIdTable (
    id int identity(1,1) not null 
) 

我可以插入單個行與一個自動生成的ID:

insert into SingleIdTable default values 

我想插入許多行,並使用輸出語法來獲得它們的ID,是這樣的:

insert into SingleIdTable 
output inserted.Id into @TableOfIds 
    select (default values) from SomeOtherTable where Attribute is null 

Wher e意圖是在SomeOtherTable的每行中插入一行到SingleIdTable,其中Attribute使用自動生成的ID爲空。上述不起作用,但我怎麼能做到這一點。我注意到,如果我的表不僅僅只有一列,我可以做到,但我不能選擇那些我真正想做的空行。我不能改變SomeOtherTable的定義。

回答

21

如果SQL Server 2008+可以使用MERGE這個。下面的示例語法。

MERGE INTO SingleIdTable 
USING (SELECT * 
     FROM SomeOtherTable 
     WHERE Attribute IS NULL) T 
ON 1 = 0 
WHEN NOT MATCHED THEN 
    INSERT 
    DEFAULT VALUES 
OUTPUT INSERTED.id; 

我不確定這個單列表有什麼實際用途?

+1

+1從來沒有想過MERGE – RichardTheKiwi

+0

狡猾...表中有人誤用NHibernate映射一個組時的人工製品。我會接受這一點,但我現在意識到我可以將內部查詢與插入相關聯,以便可以輸出inserted.id,SomeOtherTable.id)。這可能嗎?真的,我只需要將我生成的每個id的包與'SomeOtherTable'的一個元素相匹配,其中'Attribute'爲null。有什麼想法嗎? – silasdavis

+0

@silasdavis - 是的,只是使用'OUTPUT INSERTED.ID,T.id' –

-1

難道你不能用SCOPE_IDENTITY()來得到插入行的ID嗎?你的問題有點含糊,你能澄清嗎?