• 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

  • 相关阅读:
    1025WHERE执行顺序以及MySQL查询优化器
    1025基础REDIS
    1025关于explain的补充1
    1021mysql 全外连接
    python开发进程:进程开启方式&多进程
    python开发面向对象进阶:反射&内置函数
    python开发socket套接字:粘包问题&udp套接字&socketserver
    python开发面向对象基础:封装
    python开发模块基础:异常处理&hashlib&logging&configparser
    python开发面向对象基础:接口类&抽象类&多态&钻石继承
  • 原文地址:https://www.cnblogs.com/blog-east/p/7443125.html
Copyright © 2020-2023  润新知