今天看数据库SQL,有发现存储过程当中有使用到SCOPE_IDENTITY()这个函数,后来问了下谷歌大婶,搜到一个比较重要的博客,连接以下:https://dotblogs.com.tw/kkman021/2012/06/27/73096
得知SCOPE_IDENTITY()和@@IDENTITY根本的不一样,才知道本身还须要学习不少数据库
@@Identit是会话级别做用域, 下面是针对@@IDENTITY作的测试例子,特此记录. 若有欠缺各位大神分享,共同进步:)函数
--会话1,第一条返回1,第二条仍是返回1,可得知@@IDENTITY获取到的是当前会话最近的插入成功的标识符的值 INSERT INTO t(name) values('插入一条') ; SELECT @@IDENTITY; INSERT INTO t SELECT '0个影响' FROM t WHERE 1=2 SELECT @@IDENTITY
--会话1,返回批量插入的最后一个标识符的值(这里是4),因此这里max(id)返回的和@@IDENTITY的值是相等的 INSERT INTO t(name) values('插入一条') ,('插入2条') ,('插入3条') SELECT MAX(ID) FROM t; SELECT @@IDENTITY
-- 开启事务,而后回滚,@@IDENTITY值不会消失 (这里@@IDENTITY依旧会显示值,即便没有插入到数据库里面) BEGIN TRAN INSERT INTO t(name) values('插入xx条') SELECT @@IDENTITY; ROLLBACK TRAN select * from t where name='插入xx条'
--会话1,给T表添加了触发器(给t2(有主键,未设置标识符)插入一条数据),这个SQL执行之后,返回的是T表新增数据的标识符。, INSERT INTO t(name) values('插入一条') SELECT @@IDENTITY SELECT MAX(ID) FROM T2;
--会话1,给T表添加了触发器(给t2(无主键,未设置标识符)插入一条数据),这个SQL执行之后,返回的是T表新增数据的标识符。, INSERT INTO t(name) values('插入一条') SELECT @@IDENTITY SELECT MAX(ID) FROM T2;
--会话1,给T表添加了触发器(给t2(无主键,有设置标识符)插入一条数据),这个SQL执行之后,返回的是T2表新增数据的标识符。, INSERT INTO t(name) values('插入一条') SELECT @@IDENTITY SELECT MAX(ID) FROM T2;
--会话1,给T表添加了触发器(给t2(有主键,有标识符)插入一条数据),这个SQL执行之后,返回的是T2表新增数据的标识符。 INSERT INTO t(name) values('插入一条') SELECT @@IDENTITY
BEGIN TRAN --获取会话级别无触发器状况下的最近批处理的标识符 INSERT INTO T(name) VALUES('插入一条数据') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; INSERT INTO T(name) VALUES('插入一条数据') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; COMMIT TRAN
BEGIN TRAN --获取会话级别有触发器状况下的最近批处理的标识符 INSERT INTO T(name) VALUES('插入一条数据') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; INSERT INTO T(name) VALUES('插入一条数据') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; COMMIT TRAN
结论:学习
1. @@IDENTITY是做用域会话级别的,测试
2. @@IDENTITY取的列标识符的列, 由于每一个表只能 有一个列设置为自动增加spa
参考连接:https://technet.microsoft.com/zh-cn/library/ms187342(SQL.90).aspxcode