2012-10-12 88 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吗?你的问题有点含糊,你能澄清吗?