Teb*_*ebo 171 sql sql-server identity
我知道Scope_Identity()
,Identity()
,@@Identity
,并且Ident_Current()
都得到标识列的值,但我很想知道其中的差别.
我所遇到的部分争议是它们对于适用于上述这些功能的范围意味着什么?
我还想了一个使用它们的不同场景的简单例子吗?
Guf*_*ffa 348
@@identity
函数返回在同一会话中创建的最后一个标识.scope_identity()
函数返回在同一会话和相同范围中创建的最后一个标识.ident_current(name)
回报率在任何会话中的特定表或视图中创建的最后一个标识.identity()
函数不用于获取标识,它用于在select...into
查询中创建标识.会话是数据库连接.范围是当前查询或当前存储过程.
一种情形的scope_identity()
与@@identity
功能的不同,就是如果你有在桌子上的触发器.如果您有一个插入记录的查询,导致触发器在某处插入另一条记录,该scope_identity()
函数将返回查询创建的标识,而该@@identity
函数将返回触发器创建的标识.
所以,通常你会使用这个scope_identity()
功能.
Bra*_*non 40
好问题.
@@IDENTITY
:返回在SQL连接(SPID)上生成的最后一个标识值.大多数情况下它将是您想要的,但有时它不是(就像触发器响应一个触发器INSERT
,触发器执行另一个INSERT
语句).
SCOPE_IDENTITY()
:返回当前作用域中生成的最后一个标识值(即存储过程,触发器,函数等).
IDENT_CURRENT()
:返回特定表的最后一个标识值.不要使用它来获取标识值INSERT
,它受竞争条件的限制(即多个连接在同一个表上插入行).
IDENTITY()
:在将表中的列声明为标识列时使用.
有关更多参考,请参阅:http://msdn.microsoft.com/en-us/library/ms187342.aspx.
总结:如果您要插入行,你想知道该行的标识列的值,您刚插入,一直使用SCOPE_IDENTITY()
.
小智 14
如果您了解范围和会话之间的区别,那么理解这些方法将非常容易.
Adam Anderson的一篇非常好的博客文章描述了这种差异:
会话表示正在执行命令的当前连接.
范围意味着命令的直接上下文.每个存储过程调用都在其自己的作用域中执行,嵌套调用在调用过程的作用域内的嵌套作用域中执行.同样,从应用程序或SSMS执行的SQL命令在其自己的作用域中执行,如果该命令触发任何触发器,则每个触发器在其自己的嵌套作用域内执行.
因此,三种身份检索方法之间的差异如下:
@@identity
返回此会话中生成的最后一个标识值,但任何范围.
scope_identity()
返回此会话和此范围中生成的最后一个标识值.
ident_current()
返回在任何会话和任何范围内为特定表生成的最后一个标识值.
dev*_*vio 12
Scope表示执行INSERT
语句的代码上下文,SCOPE_IDENTITY()
而不是全局范围@@IDENTITY
.
CREATE TABLE Foo(
ID INT IDENTITY(1,1),
Dummy VARCHAR(100)
)
CREATE TABLE FooLog(
ID INT IDENTITY(2,2),
LogText VARCHAR(100)
)
go
CREATE TRIGGER InsertFoo ON Foo AFTER INSERT AS
BEGIN
INSERT INTO FooLog (LogText) VALUES ('inserted Foo')
INSERT INTO FooLog (LogText) SELECT Dummy FROM inserted
END
INSERT INTO Foo (Dummy) VALUES ('x')
SELECT SCOPE_IDENTITY(), @@IDENTITY
Run Code Online (Sandbox Code Playgroud)
给出不同的结果.
澄清问题@@Identity
:
例如,如果您插入一个表并且该表具有执行插入的触发器,@@Identity
则将从触发器(a log_id
或某物)中scope_identity()
的insert返回id ,同时将从原始表中的insert返回id.
所以,如果你没有任何触发器,scope_identity()
并且@@identity
将返回相同的值.如果你有触发器,你需要考虑你想要的价值.
Scope Identity
:正在执行的存储过程中添加的最后一条记录的标识。
@@Identity
: 在查询批处理中添加的最后一条记录的标识,或者作为查询的结果,例如执行插入的过程,然后触发触发器,然后插入记录将从触发器返回插入记录的标识。
IdentCurrent
: 为表分配的最后一个标识。
归档时间: |
|
查看次数: |
116427 次 |
最近记录: |