복붙노트

[SQL] IDENT_CURRENT 대 SCOPE_IDENTITY

SQL

IDENT_CURRENT 대 SCOPE_IDENTITY

많은 연구 후에 나는 SQL에서 사용해야하는 정체성 락카에 의해 혼동 조금입니다.

내가 이해에서 SCOPE_IDENTITY는 나에게 모든 테이블에서 업데이트 된 마지막 ID를 줄 것이다 IDENT_CURRENT는 지정된 테이블에서 마지막 ID를 반환합니다.

IDENT_CURRENT이다 (당신이 어떤 테이블이 업데이트됩니다 알고있는 경우) 그래서 정보가 나에게 사용하기에 가장 좋은 버전을 보일 수있을 것입니다 주어진. 그러나, 읽기에 대부분의 사람들이 SCOPE_IDENTITY를 사용하는 것을 선호 보인다. 어떤이의 뒤에 추론은 내 논리에 결함이 있습니까?

해결법

  1. ==============================

    1.당신이 테이블 이름을 변경하려는 경우 테이블 이름을 쓸 필요가있는 경우에는 어떻게됩니까? 당신은 또한을 반영하기 위해 코드를 업데이트하는 것을 잊지해야합니다. 그때 내가 @@ IDENTITY를 사용하는 트리거에서 일어나는 삽입에서 ID를 필요로하지 않는 한 나는 항상 SCOPE_IDENTITY를 사용

    당신이 테이블 이름을 변경하려는 경우 테이블 이름을 쓸 필요가있는 경우에는 어떻게됩니까? 당신은 또한을 반영하기 위해 코드를 업데이트하는 것을 잊지해야합니다. 그때 내가 @@ IDENTITY를 사용하는 트리거에서 일어나는 삽입에서 ID를 필요로하지 않는 한 나는 항상 SCOPE_IDENTITY를 사용

    또한 큰 차이는 IDENT_CURRENT는 (즉 최종 사용자의 ID 값을 생성) 당신에게 삽입 한 다른 프로세스에서 신원을 줄 것입니다 당신은 삽입을하고 당신이 SELECT IDENT_CURRENT을하기 전에 다음 누군가가 삽입 않는 경우 그래서 당신은 다른 사람의 ID 값을 얻을 것이다

    당신이 테이블에 트리거를 넣으면 어떤 일이 설명하는 몇 가지 코드가 현재 ID 값을 가져도 6 가지 방법을 참조하십시오

  2. ==============================

    2.나는 SCOPE_IDENTITY을 읽은 () 정답이어야에서, 그러나이 경우 놀이로 올 수있는 SQL 2005 및 SQL 2008의 버그가있는 것 같습니다 병렬 쿼리 계획에 삽입 결과.

    나는 SCOPE_IDENTITY을 읽은 () 정답이어야에서, 그러나이 경우 놀이로 올 수있는 SQL 2005 및 SQL 2008의 버그가있는 것 같습니다 병렬 쿼리 계획에 삽입 결과.

    자세한 내용은 다음 기사에서 살펴 보자 :

    IDENT_CURRENT 대 SCOPE_IDENTITY () 대 @@ IDENTITY - 기록의 마지막 삽입 된 신원 검색

    조 : 식스 이유는 병렬 처리에 대한 긴장한다

    섹션 제목 참조 : 1. # 328811 "SCOPE_IDENTITY ()는 때때로 잘못된 값을 반환합니다"

  3. ==============================

    3.자세히 답변이 블로그 게시물을 참조하십시오. SCOPE_IDENTITY 인해 트리거에 의해 수행 삽입에 ID를 반환하지 않습니다. 그것은 테이블 이름은 dev에 ENV에 changed..like있는 변화의 세계에서 사용 IDENT_CURRENT에 좋은 생각이 될 실 거예요.

    자세히 답변이 블로그 게시물을 참조하십시오. SCOPE_IDENTITY 인해 트리거에 의해 수행 삽입에 ID를 반환하지 않습니다. 그것은 테이블 이름은 dev에 ENV에 changed..like있는 변화의 세계에서 사용 IDENT_CURRENT에 좋은 생각이 될 실 거예요.

  4. ==============================

    4.

    /*
    * 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.
    */
    
    IF OBJECT_ID(N't6', N'U') IS NOT NULL
        DROP TABLE t6 ;
    GO
    IF OBJECT_ID(N't7', N'U') IS NOT NULL
        DROP TABLE t7 ;
    GO
    CREATE TABLE t6 (id INT IDENTITY) ;
    CREATE TABLE t7
        (
         id INT IDENTITY(100, 1)
        ) ;
    GO
    CREATE TRIGGER t6ins ON t6
        FOR INSERT
    AS
        BEGIN
            INSERT  t7
                    DEFAULT VALUES
        END ;
    GO
    --End of trigger definition
    
    SELECT  id
    FROM    t6 ;
    --IDs empty.
    
    SELECT  id
    FROM    t7 ;
    --ID is empty.
    
    --Do the following in Session 1
    INSERT  t6
            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('t7') ;
    /* Returns 100, the value inserted into t7, that is in the trigger.*/
    
    SELECT  IDENT_CURRENT('t6') ;
    /* Returns 1, the value inserted into t6 four statements before this query.*/
    
    -- Do the following in Session 2.
    SELECT  @@IDENTITY ;
    /* Returns NULL because there has been no INSERT action
    up to this point in this session.*/
    
    SELECT  SCOPE_IDENTITY() ;
    /* Returns NULL because there has been no INSERT action
    up to this point in this scope in this session.*/
    
    SELECT  IDENT_CURRENT('t7') ;
    /* Returns 100, the last value inserted into t7.*/
    
  5. ==============================

    5.이 이론은 말한다 : 언급 링크로 SCOPE_IDENTITY () (와 @@ IDENTITY)에 알고있는 버그가 있습니다 ... 경쟁 조건을 인식하고, 당신이 SCOPE_IDENTITY ()를 사용한다 트리거 내부에 삽입 신경 쓰지 않는 것이 아니라 다른 anwsers합니다. 다음 계정에이 버그를 취 Microsoft의 해결 방법입니다.

    이 이론은 말한다 : 언급 링크로 SCOPE_IDENTITY () (와 @@ IDENTITY)에 알고있는 버그가 있습니다 ... 경쟁 조건을 인식하고, 당신이 SCOPE_IDENTITY ()를 사용한다 트리거 내부에 삽입 신경 쓰지 않는 것이 아니라 다른 anwsers합니다. 다음 계정에이 버그를 취 Microsoft의 해결 방법입니다.

    기사 가장 관련 부분 아래. 그것은 출력 삽입의 절을 사용합니다 :

    DECLARE @MyNewIdentityValues table(myidvalues int)
    declare @A table (ID int primary key)
    insert into @A values (1)
    declare @B table (ID int primary key identity(1,1), B int not null)
    insert into @B values (1)
    select
        [RowCount] = @@RowCount,
        [@@IDENTITY] = @@IDENTITY,
        [SCOPE_IDENTITY] = SCOPE_IDENTITY()
    
    set statistics profile on
    insert into _ddr_T
    output inserted.ID into @MyNewIdentityValues
        select
                b.ID
            from @A a
                left join @B b on b.ID = 1
                left join @B b2 on b2.B = -1
    
                left join _ddr_T t on t.T = -1
    
            where not exists (select * from _ddr_T t2 where t2.ID = -1)
    set statistics profile off
    
    select
        [RowCount] = @@RowCount,
        [@@IDENTITY] = @@IDENTITY,
        [SCOPE_IDENTITY] = SCOPE_IDENTITY(),
        [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
    select * from @MyNewIdentityValues
    go
    
  6. ==============================

    6.SELECT IDENT_CURRENT - 마지막으로 삽입 된 ID 값 당신에게 테이블의 특정을 줄 것이라고 말했다있다. 이과 관련된 문제가 하나 개의 사용자 필요가 메타 데이터를 볼 수있는 권한을 가지고 그렇지 않으면 NULL을 반환하고 두 번째는 경우 테이블 이름 변경 문제가 발생할 것입니다 테이블의 이름을 하드 코딩되어있다.

    SELECT IDENT_CURRENT - 마지막으로 삽입 된 ID 값 당신에게 테이블의 특정을 줄 것이라고 말했다있다. 이과 관련된 문제가 하나 개의 사용자 필요가 메타 데이터를 볼 수있는 권한을 가지고 그렇지 않으면 NULL을 반환하고 두 번째는 경우 테이블 이름 변경 문제가 발생할 것입니다 테이블의 이름을 하드 코딩되어있다.

    가장 좋은 방법은 다음 예제를 봐 ... 변수와 함께 SCOPE_IDENTITY를 사용하는 것입니다

     DECLARE @myFirstTableID INT
    
      DECLARE @mySecondTableID INT
    
      INSERT INTO MYFirstTable (....) VALUES (.....)
    
       SELECT @myFirstTableID =SCOPE_IDENTITY()
    
    
      INSERT INTO MYSecondTable () VALUES (.....)
    
    
       SELECT @mySecondTableID=SCOPE_IDENTITY()
    

    따라서 다음 관심의 삽입에 대한 변수 및 SCOPE_IDENTITY 이용하여, 당신은 당신이 바로 그 테이블에서 올바른 정체성을 받고 있는지 확인 할 수 있습니다. 즐겨

  7. from https://stackoverflow.com/questions/567171/scope-identity-vs-ident-current by cc-by-sa and MIT license