@@IDENTITY 와 SCOPEIDENTITY()

2344 단어 scopeidentity
INSERT,SELECT INTO 또는 대 용량 복사 문 구 를 완성 한 후@IDENTITY 에 문 구 를 포함 하여 생 성 된 마지막 표지 값 입 니 다.만약 문장 이 표지 열 을 포함 하 는 표 에 영향 을 주지 않 는 다 면@IDENTITY 는 NULL 로 돌아 갑 니 다.여러 줄 이 삽입 되 어 여러 개의 표지 값 이 생 성 되면@@IDENTITY 는 마지막 으로 생 성 된 표지 값 을 되 돌려 줍 니 다.만약 에 문장 이 하나 이상 의 트리거 를 촉발 하면 이 트리거 는 표지 값 을 생 성 하 는 삽입 작업 을 실 행 했 습 니 다.그러면 문장 이 실 행 된 후에@IDENTITY 를 즉시 호출 하면 트리거 가 생 성 한 마지막 표지 값 을 되 돌려 줍 니 다.표지 열 을 포함 하 는 표 에 삽입 작업 을 수행 한 후 트리거 가 트리거 되 고 트리거 가 표지 열 이 없 는 다른 표 에 삽입 작업 을 수행 하면@@IDENTITY 는 처음 삽 입 된 표지 값 을 되 돌려 줍 니 다.INSERT 나 SELECT INTO 문구 가 실패 하거나 대 용량 복사 가 실 패 했 거나,트 랜 잭 션 이 스크롤 백 된 경우@@IDENTITY 값 은 이전 설정 으로 복원 되 지 않 습 니 다.
      만약 에 문장 과 업무 가 실패 하면 표 의 현재 표 지 를 변경 하여 표지 열 에 있 는 값 이 일관성 이 없 는 현상 을 나타 낸다.표 에 값 을 삽입 하려 는 사 무 를 제출 하지 않 아 도 표지 값 을 다시 굴 릴 수 없습니다.예 를 들 어 IGNOREDUP_KEY 충돌 로 인해 INSERT 문구 가 실 패 했 습 니 다.표 의 현재 표지 값 은 여전히 증가 합 니 다.
     @@IDENTITY、SCOPE_IDENTITY 와 IDENTCURRENT 는 표 에 삽 입 된 IDENTITY 열의 마지막 값 을 되 돌려 주기 때문에 비슷 한 함수 입 니 다.
     @@IDENTITY 와 SCOPEIDENTITY 는 현재 세 션 의 모든 표 에서 생 성 된 마지막 표지 값 을 되 돌려 줍 니 다.하지만,SCOPEIDENTITY 는 현재 역할 영역 에서 만 값 을 되 돌려 줍 니 다.@@IDENTITY 는 특정한 역할 영역 에 국한 되 지 않 습 니 다.
     IDENT_CURRENT 는 역할 영역 과 세 션 의 제한 을 받 지 않 고 지 정 된 표 에 제 한 됩 니 다.IDENT_CURRENT 는 모든 세 션 과 모든 역할 영역 에서 특정한 표 에 생 성 된 표지 값 을 되 돌려 줍 니 다.
     @@IDENTITY 함수 의 역할 영역 은 이 함 수 를 실행 하 는 로 컬 서버 의 현재 세 션 입 니 다.이 함 수 는 원 격 또는 링크 서버 에 적용 할 수 없습니다.다른 서버 의 표지 값 을 얻 으 려 면 원 격 서버 나 링크 서버 에서 저장 과정 을 실행 하고(원 격 또는 링크 서버 환경 에서 실 행 된)이 저장 과정 에서 표지 값 을 수집 하여 로 컬 서버 에서 호출 된 연결 로 되 돌려 주 십시오.
     다음 예제 에 서 는 표지 열(LocationID)을 포함 하 는 표 에 한 줄 을 삽입 하고@@IDENTITY 를 사용 하여 새 줄 에 사용 할 표지 값 을 표시 합 니 다. 변경 작업 이 있 는 범위 제약 을 무시 했다.예 를 들 어 저 는 표 A 와 표 B 두 개의 시 계 를 가지 고 있 습 니 다.지금 은 표 A 에 Insert 트리거 를 정 의 했 습 니 다.표 A 에 데 이 터 를 삽입 할 때 표 B 에 도 데 이 터 를 자동 으로 삽입 합 니 다.이때 두 개의 원자 조작 이 있 습 니 다.A 에 데 이 터 를 삽입 한 다음 에 B 에 데 이 터 를 삽입 합 니 다. 지금 생각해 보 겠 습 니 다.위의 표 A 와 표 B 에 IDENTITY 자체 증가 도 메 인 이 있다 고 가정 하면 표 A 에 데 이 터 를 삽입 한 후에 SELECT@@IDENTITY 출력 을 사 용 했 을 때 출력 한 것 은 도대체 A 입 니까?B 의 자체 증가 도 메 인 값 입 니까?  답 은 분명 하 다.누가 마지막 에 삽입 하면 출력 하 는 지,그러면 B 다.그래서 저 는 A 의 자 증 도 메 인 값 을 얻 으 려 고 했 는데 B 의 자 증 도 메 인 값 을 얻 었 고 BUG 한 마리 가 탄생 했 습 니 다.잘못 하면 전체 시스템 데이터 의 혼란 에 영향 을 줄 수 있 습 니 다. 따라서 이 경우@@IDENTITY 대신 SCOPE 를 사용 하 는 것 을 권장 합 니 다.IDENTITY()함수 가 바 뀌 었 습 니 다.SCOPE_IDENTITY()도 마지막 자 증 역 의 값 을 얻 었 지만,@IDENTITY 가 아 닌 한 작업 범위 내 에서 만 자 증 역 의 값 을 얻 었 습 니 다.

좋은 웹페이지 즐겨찾기