SQL服务器:是有可能得到最近插入标识列值而不表变量

比方说,我有一个表

my_table(id int identity(1,1) not null primary key, data varchar(100))

我想写插入新行到该表并返回ID的过程。 我试过了

DECLARE @new_id INT; SELECT @new_id = id FROM ( INSERT INTO my_table(data) OUTPUT inserted.id VALUES ('test') ) as NewVal(id)

该代码不工作(我得到了“嵌套INSERT,UPDATE,DELETE或MERGE语句不是SELECT语句,是不是行INSERT语句直接来源允许的。”)。 不过,如果我使用一个表变量,我可以做

DECLARE @new_id INT; DECLARE @tmp_table TABLE(int id); INSERT INTO @tmp_table SELECT id FROM ( INSERT INTO my_table(data) OUTPUT inserted.id VALUES ('test') ) as NewVal(id); // OR INSERT INTO my_table(data) OUTPUT inserted.id INTO @tmp_table VALUES ('test') ; SELECT @new_id = id FROM @tmp_table;

是否有可能实现,而无需使用表变量相同的功能?

UPDATE
感谢您的快速反应,+1大家与SCOPE_IDENTITY解决方案。 这可能是我的错,我应该问清楚的问题-我用MERGE (一个例子是更长的时间,所以我贴INSERT代替),而不是INSERT所以SCOPE_IDENTITY并没有真正为我工作。

--------------解决方案-------------

有点较短的版本不是在INSERT语句嵌套使用output...into

declare @tmp_table table(actiontaken nvarchar(10), id int);

merge my_table
using (values ('test')) as S(data)
on 0=1
when not matched then
insert (data) values (S.data)
output $action, inserted.id into @tmp_table;

我相信,你应该从合并中使用表变量。 输出可能包含多个行。

是的,你可以插入后返回SCOPE_IDENTITY(这比@@ IDENTITY安全由于作用域差异)。

INSERT my_table (data) VALUES ('test')
SELECT SCOPE_IDENTITY()

SELECT SCOPE_IDENTITY()将得到范围最后插入的标识值。

如果你使用

select @@identity

您将获得进入标识列从任何地方的最后一个值。

如果你想进入从刚刚运行的脚本列中的值,你应该使用

select SCOPE_IDENTITY()

如果你只是想插入从任何会话中的任何陈述一个给定的表中标识列的最后一个值,你应该使用

select IDENT_CURRENT('tablename')

select @@identityselect SCOPE_IDENTITY()将返回你正在寻找的价值

分类:SQL服务器 时间:2015-03-15 人气:1
本文关键词: SQL服务器
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.466 (s). 10 q(s)