zoukankan      html  css  js  c++  java
  • IDENTITY、SCOPE_IDENTITY、IDENT_CURRENT的分析

    IDENT_CURRENT、IDENTITY、SCOPE_IDENTITY区别

    概念解释

    • IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.

    • IDENTITY returns the last identity value generated for any table in the current session, across all scopes.

    • SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope.

    查找到有中文解释,但还是发现用英文解释,更容易理解。

    IDENT_CURRENT,为指定表的所有会话和所有作用域生成的最后一个标识值;
    IDENTITY,为当前会话的所有表和所有作用域的最后一个标识值;
    SCOPE_IDENTITY,当前会话和当前作用域的所有表的最后一个标识值;

    SQL说明

    CREATE TABLE Test1(id int IDENTITY);
    CREATE TABLE Test2(id int IDENTITY(100,1));
    GO
    CREATE TRIGGER Test1ins ON Test1 FOR INSERT 
    AS
    BEGIN
       INSERT Test2 DEFAULT VALUES
    END;
    GO
    --End of trigger definition
    
    SELECT id FROM Test1;
    --IDs empty.
    SELECT id FROM Test2;
    --ID is empty.
    
    --Do the following in Session 1
    INSERT Test1 DEFAULT VALUES;
    SELECT @@IDENTITY;
    /*Returns the value 100. This was inserted by the trigger.*/
    
    SELECT SCOPE_IDENTITY();
    /* Returns the value 1. This was inserted by the 
    INSERT statement two statements before this query.*/
    
    SELECT IDENT_CURRENT('Test2');
    /* Returns value inserted into Test2, that is in the trigger.*/
    
    SELECT IDENT_CURRENT('Test1');
    /* Returns value inserted into Test1. This was the INSERT statement four statements before this query.*/

    所有在执行insert 表A、B、C的事务时候,取IDENT_CURRENT("A")的时候,又没有及时将此ident插入相应记录D,而这个记录表D又要求插入的ident有唯一索引。这时就可能出现唯一索引重复插入失败,因为,在执行事务的时候其它会话,可能已经将此ident插入记录表D。所以这时候用SCOPE_IDENTITY更稳健一点。

    补充

     

    sessionscope 在博客园找到的概念是这样的:

    一个作用域 就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

    会话 一个用户连接产生的所有上下文信息。一个查询分析器窗口就是一个会话

    但是一个用户connection代表一个session,这个好像不对。

    A connection represents the external connection to the server (over a network or locally through shared memory for example).
    A session represents a user process within SQL Server.
    A connection may be associated with zero, one, or many sessions.

    Take a look at the columns on sys.dm_exec_connections and sys.dm_exec_sessions. That should give you a feel for the differences.

     sys.dm_exec_connections http://msdn.microsoft.com/zh-cn/library/ms181509.aspx 

    sys.dm_exec_sessions  http://msdn.microsoft.com/zh-cn/library/ms176013.aspx

     

     

  • 相关阅读:
    SQL server 2008 建立新用户
    2021.3.22-刷题 (移位)
    2021.3.17刷题-分割回文串
    2021.3.16 刷题--组合总和||(一种组合下元素不可重复选取)
    2021.3.15刷题-组合总和(元素可重复选取)
    2021.3.14刷题-设计哈希映射
    2021.3.13刷题-用拉链法设计哈希集合
    2021.3.12刷题-验证二叉树的前序序列化
    2021.3.11刷题-(删除二叉搜索树中的节点)
    2021.2.28刷题 回溯-电话字母组合
  • 原文地址:https://www.cnblogs.com/daihuiquan/p/2956845.html
Copyright © 2011-2022 走看看