Sei*_*bar 59 sql t-sql sql-server identity output-clause
我已经看到在插入后检索主键标识字段的值时使用的各种方法.
declare @t table (
id int identity primary key,
somecol datetime default getdate()
)
insert into @t
default values
select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1
Run Code Online (Sandbox Code Playgroud)
在插入后返回标识表:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
Run Code Online (Sandbox Code Playgroud)
什么方法适当或更好?OUTPUT方法是否范围安全?
mso*_*son 74
这取决于你想要做什么......
@@ IDENTITY
返回在连接上生成的最后一个IDENTITY值,无论生成该值的表如何,也不管生成该值的语句的范围如何.@@ IDENTITY将返回在当前会话中输入到表中的最后一个标识值.@@ IDENTITY仅限于当前会话,不限于当前范围.例如,如果您在表上触发了导致在另一个表中创建标识的触发器,您将获得最后创建的标识,即使它是创建它的触发器.
SCOPE_IDENTITY()
返回在连接上生成的最后一个IDENTITY值以及同一范围内的语句,而不管生成该值的表.SCOPE_IDENTITY()类似于@@ IDENTITY,但它也会将值限制为当前范围.换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识.
IDENT_CURRENT()
返回表中生成的最后一个IDENTITY值,而不管生成该值的语句的连接和范围如何.IDENT_CURRENT仅限于指定的表,但不受连接或范围的限制.
OUTPUT在尝试获取刚刚插入的行的标识时,几乎没有理由使用除子句之外的任何内容.OUTPUT子句是作用域和表安全的.
这是一个在插入单行后获取id的简单示例...
DECLARE @Inserted AS TABLE (MyTableId INT);
INSERT [MyTable] (MyTableColOne, MyTableColTwo)
OUTPUT Inserted.MyTableId INTO @Inserted
VALUES ('Val1','Val2')
SELECT MyTableId FROM @Inserted
Run Code Online (Sandbox Code Playgroud)
OUTPUT子句的详细文档:http://technet.microsoft.com/en-us/library/ms177564.aspx
-- table structure for example:
CREATE TABLE MyTable (
MyTableId int NOT NULL IDENTITY (1, 1),
MyTableColOne varchar(50) NOT NULL,
MyTableColTwo varchar(50) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
SQL Server 2005 中还提供了另一种方法,在 SQL in the Wild 中进行了概述。
这将允许您在插入后检索多个身份。这是博客文章中的代码:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
Run Code Online (Sandbox Code Playgroud)