[SQL] IDENT_CURRENT 대 SCOPE_IDENTITY
SQLIDENT_CURRENT 대 SCOPE_IDENTITY
많은 연구 후에 나는 SQL에서 사용해야하는 정체성 락카에 의해 혼동 조금입니다.
내가 이해에서 SCOPE_IDENTITY는 나에게 모든 테이블에서 업데이트 된 마지막 ID를 줄 것이다 IDENT_CURRENT는 지정된 테이블에서 마지막 ID를 반환합니다.
IDENT_CURRENT이다 (당신이 어떤 테이블이 업데이트됩니다 알고있는 경우) 그래서 정보가 나에게 사용하기에 가장 좋은 버전을 보일 수있을 것입니다 주어진. 그러나, 읽기에 대부분의 사람들이 SCOPE_IDENTITY를 사용하는 것을 선호 보인다. 어떤이의 뒤에 추론은 내 논리에 결함이 있습니까?
해결법
-
==============================
1.당신이 테이블 이름을 변경하려는 경우 테이블 이름을 쓸 필요가있는 경우에는 어떻게됩니까? 당신은 또한을 반영하기 위해 코드를 업데이트하는 것을 잊지해야합니다. 그때 내가 @@ IDENTITY를 사용하는 트리거에서 일어나는 삽입에서 ID를 필요로하지 않는 한 나는 항상 SCOPE_IDENTITY를 사용
당신이 테이블 이름을 변경하려는 경우 테이블 이름을 쓸 필요가있는 경우에는 어떻게됩니까? 당신은 또한을 반영하기 위해 코드를 업데이트하는 것을 잊지해야합니다. 그때 내가 @@ IDENTITY를 사용하는 트리거에서 일어나는 삽입에서 ID를 필요로하지 않는 한 나는 항상 SCOPE_IDENTITY를 사용
또한 큰 차이는 IDENT_CURRENT는 (즉 최종 사용자의 ID 값을 생성) 당신에게 삽입 한 다른 프로세스에서 신원을 줄 것입니다 당신은 삽입을하고 당신이 SELECT IDENT_CURRENT을하기 전에 다음 누군가가 삽입 않는 경우 그래서 당신은 다른 사람의 ID 값을 얻을 것이다
당신이 테이블에 트리거를 넣으면 어떤 일이 설명하는 몇 가지 코드가 현재 ID 값을 가져도 6 가지 방법을 참조하십시오
-
==============================
2.나는 SCOPE_IDENTITY을 읽은 () 정답이어야에서, 그러나이 경우 놀이로 올 수있는 SQL 2005 및 SQL 2008의 버그가있는 것 같습니다 병렬 쿼리 계획에 삽입 결과.
나는 SCOPE_IDENTITY을 읽은 () 정답이어야에서, 그러나이 경우 놀이로 올 수있는 SQL 2005 및 SQL 2008의 버그가있는 것 같습니다 병렬 쿼리 계획에 삽입 결과.
자세한 내용은 다음 기사에서 살펴 보자 :
IDENT_CURRENT 대 SCOPE_IDENTITY () 대 @@ IDENTITY - 기록의 마지막 삽입 된 신원 검색
조 : 식스 이유는 병렬 처리에 대한 긴장한다
섹션 제목 참조 : 1. # 328811 "SCOPE_IDENTITY ()는 때때로 잘못된 값을 반환합니다"
-
==============================
3.자세히 답변이 블로그 게시물을 참조하십시오. SCOPE_IDENTITY 인해 트리거에 의해 수행 삽입에 ID를 반환하지 않습니다. 그것은 테이블 이름은 dev에 ENV에 changed..like있는 변화의 세계에서 사용 IDENT_CURRENT에 좋은 생각이 될 실 거예요.
자세히 답변이 블로그 게시물을 참조하십시오. SCOPE_IDENTITY 인해 트리거에 의해 수행 삽입에 ID를 반환하지 않습니다. 그것은 테이블 이름은 dev에 ENV에 changed..like있는 변화의 세계에서 사용 IDENT_CURRENT에 좋은 생각이 될 실 거예요.
-
==============================
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.이 이론은 말한다 : 언급 링크로 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.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 이용하여, 당신은 당신이 바로 그 테이블에서 올바른 정체성을 받고 있는지 확인 할 수 있습니다. 즐겨
from https://stackoverflow.com/questions/567171/scope-identity-vs-ident-current by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 스파크에서 쿼리의 실행 시간을 측정하는 방법 (0) | 2020.05.27 |
---|---|
[SQL] HQL : 그것은 내부 하위 쿼리에 가입 수행 할 수 있습니까? (0) | 2020.05.27 |
[SQL] 오라클에 연결되어 SQL 서버에서 SQL 쿼리를 작성할 때 어떻게 날짜 리터럴을 지정합니까? (0) | 2020.05.27 |
[SQL] 나는 물음표를 포함 PostgreSQL을 JSON (B) 연산자를 어떻게 사용합니까? "" 를 통해 JDBC (0) | 2020.05.27 |
[SQL] 문, SQL 및도록 SqlConnection을 사용하는 C #을 (0) | 2020.05.26 |