SCOPE_IDENTITY()
@@IDENTYITY,SCOPE_IDENTITY的主要区别:在有触发器中而且触发器的内容里面含有插入标识符的操作的时候,@@IDENTITY则返回的是触发器里面新插入标识符的值而SCOPE_IDENTITY则是不变,即离该语句上面最近的标识符的值。
SCOPE_IDENTITY()测试用例:
--会话1,第一条返回1,第二条还是返回1,可得知SCOPE_IDENTITY()获取到的是当前会话最近的插入成功的标识符的值
INSERT INTO t(name) values('插入一条') ;
SELECT SCOPE_IDENTITY();
INSERT INTO t SELECT '0个影响' FROM t WHERE 1=2
SELECT SCOPE_IDENTITY()

--会话1,返回批量插入的最后一个标识符的值(这里是4),所以这里max(id)返回的值和SCOPE_IDENTITY()的值是相等的
INSERT INTO t(name) values('插入一条') ,('插入2条') ,('插入3条')
SELECT MAX(ID) FROM t;
SELECT SCOPE_IDENTITY();

-- 开启事务,然后回滚,SCOPE_IDENTITY()值不会消失 (这里SCOPE_IDENTITY()依旧会显示值,即使没有插入到数据库里面)
BEGIN TRAN
INSERT INTO t(name) values('插入xx条')
SELECT SCOPE_IDENTITY()
ROLLBACK TRAN
select * from t where name='插入xx条'

--给T表添加一个触发器,触发器功能是给t2表(有主键,未设置标识符)插入一条记录,执行后返回的是T表的值。
INSERT INTO t(name) values('插入一条')
SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;

--给T表添加一个触发器,触发器功能是给t2表(无主键,未设置标识符)插入一条记录,执行后返回的是T表的值。
INSERT INTO t(name) values('插入一条')
SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;

--给T表添加一个触发器,触发器功能是给t2表(有主键,有设置标识符)插入一条记录,执行后返回的是T表的值(这个是和@@IDENTITY根本的不同,@@IDENTITY返回的是T2表的标识符的值)
INSERT INTO t(name) values('插入一条')
SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;

--给T表添加一个触发器,触发器功能是给t2表(无主键,有设置标识符)插入一条记录,执行后返回的是T表的值(这个是和@@IDENTITY根本的不同,@@IDENTITY返回的是T2表的标识符的值)
INSERT INTO t(name) values('插入一条')
SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;

BEGIN TRAN
--获取会话级别无触发器情况下的最近批处理的标识符
INSERT INTO T(name) VALUES('插入一条数据')
SELECT MAX(ID) FROM T;
SELECT SCOPE_IDENTITY(); INSERT INTO T(name) VALUES('插入一条数据')
SELECT MAX(ID) FROM T;
SELECT SCOPE_IDENTITY();
COMMIT TRAN

BEGIN TRAN
--获取会话级别无触发器情况下的最近批处理的标识符
INSERT INTO T(name) VALUES('插入一条数据')
SELECT MAX(ID) FROM T;
SELECT SCOPE_IDENTITY(); INSERT INTO T(name) VALUES('插入一条数据')
SELECT MAX(ID) FROM T;
SELECT SCOPE_IDENTITY();
COMMIT TRAN

参考资料:https://msdn.microsoft.com/zh-cn/library/ms190315(v=sql.90).aspx
SCOPE_IDENTITY()的更多相关文章
- 在output 子句和 scope_identity() 混合使用的时候的注意事项
无意睹到一篇旧文档 SR0008:考虑使用 SCOPE_IDENTITY 代替 @@IDENTITY :https://msdn.microsoft.com/zh-cn/library/dd17212 ...
- <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY
MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...
- Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别
预备知识:SQLServer的IDENTITY关键字IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:iden ...
- @@IDENTITY与SCOPE_IDENTITY()
在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值.如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL. ...
- IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
获取表的标识值,有3种比较常见的用法 IDENT_CURRENT ,@@identity,SCOPE_IDENTITY(),有啥不一样呢? 3个关键字在联机手册中的解释 IDENT_CURRENT ...
- [MSSQL]SCOPE_IDENTITY,IDENT_CURRENT以及@@IDENTITY的区别
简单解释下SCOPE_IDENTITY函数,IDENT_CURRENT函数以及@@IDENTITY全局变量的区别 SCOPE_IDENTITY函数返回当前作用域内,返回最后一次插入数据表的标识,意思是 ...
- SCOPE_IDENTITY的作用
SCOPE_IDENTITY返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域就是一个模块——存储过程.触发器.函数或批处理.因此,如果两个语句处于同一个存储 ...
- sql语句返回主键SCOPE_IDENTITY()
在sql语句后使用 SCOPE_IDENTITY() 当然您也可以使用 SELECT @@IDENTITY 但是使用 SELECT @@IDENTITY是去全局最新. 有可能取得值不正确. 示例:in ...
- [SQL]select scope_identity()传回插入相同范围之识别资料行中的最后一个识别值
传回插入相同范围之识别资料行中的最后一个识别值.范围是一个模组:预存程序.触发程序.函数或批次.因此,如果两个陈述式在相同预存程序.函数或批次中,它们就在相同范围中. 语法: SCOPE_IDENTI ...
- 放弃SCOPE_Identity,使用OUTPUT代替
最近项目中使用了SCOPE_IDENTITY()来获取新增数据的自动递增ID号. 在运行过程中会不时的发生无法通过SCOPE_IDENTITY()来获取ID号的情况. 尝试着测试又发现不了问题. 今天 ...
随机推荐
- 【知了堂学习笔记】/JavaScript对象--/暖妮
JavaScript对象 1.什么是JavaScript对象? JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 在 JavaScript 中,对象是拥有属性和方法的数据. ...
- ssh框架遇到的问题总结
1.org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource ...
- For循环将将数字集合分类写入字典
有以下数字集合[11,22,33,44,55,66,77,88,99,25,35,45,66,88],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中.即{'k1' ...
- .NET(c#) 移动开发平台 - Smobiler(1)
如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xamarin更好用的国内的.net移动开发平台,smobiler,不用学习另外一套开发模式或者搭建复杂 ...
- python函数高级特性
掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...
- js中var,let,const理解
var变量提升: 解释:在声明a之前输出a,因为a是使用var声明变量得到提升,解释为下句 var a: console.log(a) a = 1; var声明会提到最上面的位置,但是赋值的位置还是当 ...
- 七牛php-sdk使用
使用七牛云存储服务有一年多了,大部分功能基于其PHP-SDK来做开发,现对sdk的一些功能做一个总结. 一.资源上传 上传资源文件到七牛空间的不同实现方法 二.文档转换 介绍如何使用七牛以及七牛第三方 ...
- Open Judge 2750 鸡兔同笼
2750:鸡兔同笼 ...
- Codeforces Beta Round #1 A,B,C
A. Theatre Square time limit per test:1 second memory limit per test:256 megabytes input:standard in ...
- bzoj 3065: 带插入区间K小值(分块)
Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它 ...