传回插入相同范围之识别资料行中的最后一个识别值。范围是一个模组:预存程序、触发程序、函数或批次。因此,如果两个陈述式在相同预存程序、函数或批次中,它们就在相同范围中。

语法:

SCOPE_IDENTITY()

传回类型:

numeric

备注:

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是类似的函数,因为它们会传回插入识别资料行的值。

IDENT_CURRENT 不受范围和工作阶段的限制;它只限于指定的资料表。IDENT_CURRENT 会传回在任何工作阶段和任何范围中,产生给特定资料表的值。如需详细资讯,请参阅<IDENT_CURRENT (Transact-SQL)>。

SCOPE_IDENTITY 和 @@IDENTITY 会传回目前工作阶段任何资料表中所产生的最後一个识别值。不过,SCOPE_IDENTITY 会传回只在目前范围内插入的值;@@IDENTITY 不限于特定范围。

例如,有 T1 和 T2 两份资料表,T1 定义了 INSERT 触发程序。当资料列插入 T1 时,会引发触发程序,且会在 T2 中插入一个资料列。这个状况说明两个范围:在 T1 插入,以及触发程序在 T2 插入。

假设 T1 和 T2 都有识别资料行,在 T1 的 INSERT 陈述式结束时,@@IDENTITY 和 SCOPE_IDENTITY 会传回不同的值。@@IDENTITY 会传回在目前工作阶段中,跨越任何范围所插入的最後一个识别资料行值。这是在 T2 中插入的值。SCOPE_IDENTITY() 会传回在 T1 中插入的 IDENTITY 值。这是相同范围内所发生的最後一项插入。如果在范围内的识别资料行执行任何 INSERT 陈述式之前叫用 SCOPE_IDENTITY() 函数,这个函数会传回 Null 值。

失败的陈述式和交易可能会变更资料表的目前识别,以及建立识别资料行值中的间距。识别值永远不会回复,即使试图将值插入资料表的交易未获认可,也是如此。例如,如果 INSERT 陈述式因 IGNORE_DUP_KEY 违规而失败,资料表的目前识别值仍会递增。

范例:

A. 使用 @@IDENTITY 和 SCOPE_IDENTITY 搭配触发程序

下列范例会建立 TZ 和 TY 这两份资料表,以及 TZ 的 INSERT 触发程序。当资料列插入 TZ 资料表时,会引发触发程序 (Ztrig),且会在 TY 中插入一个资料列。

USE tempdb

GO

CREATE TABLE TZ (

Z_id int IDENTITY(1,1)PRIMARY KEY,

Z_name varchar(20) NOT NULL)

INSERT TZ

VALUES ('Lisa')

INSERT TZ

VALUES ('Mike')

INSERT TZ

VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks.

Z_id Z_name

-------------

1 Lisa

2 Mike

3 Carla

CREATE TABLE TY (

Y_id int IDENTITY(100,5)PRIMARY KEY,

Y_name varchar(20) NULL)

INSERT TY (Y_name)

VALUES ('boathouse')

INSERT TY (Y_name)

VALUES ('rocks')

INSERT TY (Y_name)

VALUES ('elevator')

SELECT * FROM TY

--Result set: This is how TY looks:

Y_id Y_name

---------------

100 boathouse

105 rocks

110 elevator

/*Create the trigger that inserts a row in table TY

when a row is inserted in table TZ*/

CREATE TRIGGER Ztrig

ON TZ

FOR INSERT AS

BEGIN

INSERT TY VALUES ('')

END

/*FIRE the trigger and determine what identity values you obtain

with the @@IDENTITY and SCOPE_IDENTITY functions.*/

INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

GO

SELECT @@IDENTITY AS [@@IDENTITY]

GO

以下为结果集:

SCOPE_IDENTITY

4

/*SCOPE_IDENTITY returned the last identity value in the same scope. This was the insert on table TZ.*/

@@IDENTITY

115

/*@@IDENTITY returned the last identity value inserted to TY by the trigger. This fired because of an earlier insert on TZ.*/

B. 使用 @@IDENTITY 和 SCOPE_IDENTITY() 搭配复写

下列范例会说明如何针对为了合并式复写而发行之资料库的插入,使用 @@IDENTITY 和 SCOPE_IDENTITY()。范例中的两份资料表都位於 AdventureWorks 范例资料库中:Person.ContactType 尚未发行,而 Sales.Customer 已发行。合并式复写会将触发程序加入至发行的资料表。因此,@@IDENTITY 可能会根据复写系统资料表的插入 (而非使用者资料表的插入) 传回值。

Person.ContactType 资料表具有最大识别值 20。如果您将资料列插入此资料表,@@IDENTITY 和 SCOPE_IDENTITY() 就会传回相同的值。

USE AdventureWorks;

GO

INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager')

GO

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

GO

SELECT @@IDENTITY AS [@@IDENTITY]

GO

以下为结果集:

SCOPE_IDENTITY

21

@@IDENTITY

21

Sales.Customer 资料表具有最大识别值 29483。如果您将资料列插入此资料表,@@IDENTITY 和 SCOPE_IDENTITY() 就会传回不同的值。SCOPE_IDENTITY() 会根据使用者资料表的插入传回值,而 @@IDENTITY 会根据复写系统资料表的插入传回值。您可以针对需要存取已插入识别值的应用程式,使用 SCOPE_IDENTITY()。

INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (8,'S')

GO

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

GO

SELECT @@IDENTITY AS [@@IDENTITY]

GO

以下为结果集:

SCOPE_IDENTITY

24984

@@IDENTITY

select scope_identity()相关推荐

  1. select @@IDENTITY返回的id出错,select SCOPE_IDENTITY()代替

    用代码生成器生成的代码中,一条插入语句后面一般都跟上;select @@IDENTITY这么一个全局变量,主要是为了加插入记录的id返还回来,返回的id平时都没怎么用到过,今天用的时候,突然发现返回的 ...

  2. @@identity、scope_identity()、IDENT_CURRENT('tablename')函数的区别

    @@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值.但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值:@@IDENTITY 不受限于 ...

  3. 【mysql】SCOPE_IDENTITY 和 @@IDENTITY的区别

    SCOPE_IDENTITY 和 @@IDENTITY 的作用都是取得返回在当前会话中的任何表内所生成的最后一个标识值. @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值. ...

  4. SCOPE_IDENTITY和@@identity的区别

    SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值. IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的 ...

  5. 在output 子句和 scope_identity() 混合使用的时候的注意事项

    无意睹到一篇旧文档 SR0008:考虑使用 SCOPE_IDENTITY 代替 @@IDENTITY :https://msdn.microsoft.com/zh-cn/library/dd17212 ...

  6. dotnet 获得存储过程返回值和输出参数有什么不同 @@IDENTITY SCOPE_IDENTITY()

    存储过程1: Create PROCEDURE CreateNewUser @UserName varchar(50), @Password varchar(50), @Description var ...

  7. SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT()

    SQL Server 中,可以使用 SCOPE_IDENTITY(). @@IDENTITY . IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于: SCOPE_IDENTIT ...

  8. insert into 后获得自动插入的id(select @@identity)

    当运行完插入语句后,执行select   @@identity就可得到自动生成的id 如果是sql server 最好用select SCOPE_IDENTITY() as id 因为@@identi ...

  9. scope_identity() mysql_SCOPE_IDENTITY的作用

    SCOPE_IDENTITY 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域就是一个模块--存储过程.触发器.函数或批处理.因此,如果两个语句处于同一个存 ...

最新文章

  1. nyoj 202红黑树 (搜索)
  2. html网页设计大赛_HTML5网页设计大赛 || 决赛名单公布
  3. 操作系统——实验叁——主存空间的分配与回收
  4. php 关闭 row,MySql php:检查Row是否存在
  5. 泡泡玛特上市首日涨79.22%报69港元 总市值953亿港元
  6. leetcode算法121.买卖股票的最好时机
  7. debian7升级到debian9
  8. 水下机器人ROV和AUV
  9. drop、truncate和delete的区别
  10. ROS实践3:publisher模板教程
  11. geogebra动态数学软件,实用工具
  12. 透明木头问世!“木头大王”胡良兵再发顶刊,已成立公司加速落地
  13. 计算机软件检验 考试题,历年计算机软件水平程序员部分考试真题
  14. solidworks 3D模型文件导出到tanner ledit版图软件中
  15. 纵横交错的学问——Power Plan
  16. 案例分享:Qt数据分析处理平台(兼容各国产麒麟系统)(文件域字符串解析,上万文件批量导入,折线图、散点图,正态分布图分析处理导出等)
  17. Python项目实践:蒙特卡罗方法计算圆周率
  18. 猴子补丁(Monkey Patching)
  19. 如何给自己的公众号引流的八种方法《知乎篇》知乎运营软件
  20. git pull 无响应_git clone 和 git pull 代码无响应

热门文章

  1. 常用技巧 —— 桶排
  2. 单词的长度(信息学奥赛一本通-T1142)
  3. A*B问题(信息学奥赛一本通-T1036)
  4. 15 PP配置-生产计划-主数据-定义特殊采购类型
  5. 树莓派 python 无人机_DIY一个基于树莓派和Python的无人机视觉跟踪系统
  6. mac微软雅黑字体_“微软雅黑”有坑,小编向你推荐免费的开源字体
  7. python多线程编程_python多线程编程(1): python对多线程的支持
  8. Vue调试神器vue-devtools - 插件下载安装
  9. WebStorm 零起点搭建Vuejs项目 - 全程篇
  10. WebStorm 常用快捷键大全 - 归纳总结篇