zoukankan      html  css  js  c++  java
  • @@IDENTITY详细测试

    今天看数据库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取的列标识符的列,  因为每个表只能 有一个列设置为自动增长

    参考链接:https://technet.microsoft.com/zh-cn/library/ms187342(SQL.90).aspx

  • 相关阅读:
    关于selenium中的sendKeys()隔几秒发送一个字符
    C#使用.net.mail配置163邮箱报错:不允许使用邮箱名称。 服务器响应为:authentication is required,smtp9,DcCowABHK4UYE11W2k6fAQ--.52196S2 1448940312
    Git一个本地仓库同时推送到多个远程仓库
    MySQL中的字符数据存储
    在IIS中启用net.tcp传输协议
    MS CRM 2016 二次开发知识点
    微软 CRM 2016 自定义视图顶部按钮
    CodeSmith7.0.2连接Oracle10.2
    使用Entity framework框架执行存储过程
    SQL建表公共字段脚本
  • 原文地址:https://www.cnblogs.com/blog-east/p/7424107.html
Copyright © 2011-2022 走看看