@@identity, SCOPE_IDENTITY, IDENT_CURRENT 비교

내가 MSSQL 사용자 모임에 썼던 글.

예전의 ‘택’님께서 올리신 글에도 나온 내용이지만, 온라인 북에 좀더 자세한 설명과 예제가 있길래 가져왔습니다.

IDENT_CURRENT는 Microsoft® SQL Server™ 2000 ID 함수인 SCOPE_IDENTITY와 @@IDENTITY와 유사합니다. 이 세 함수 모두 최근에 생성된 ID 값을 반환합니다. 그러나 각 함수에서 ‘최근’이 정의되는 범위와 세션은 각기 다릅니다.

  • IDENT_CURRENT는 임의의 세션과 범위에 있는 특정 테이블에 대해 생성된 마지막 ID 값을 반환합니다.
  • @@IDENTITY는 전체 범위에 걸쳐 현재 세션에 있는 임의의 테이블에 대해 생성된 마지막 ID 값을 반환합니다.
  • SCOPE_IDENTITY는 현재 세션과 현재 범위에 있는 임의의 테이블에 대해 만들어진 마지막 ID 값을 반환합니다.

예제
다음은 IDENT_CURRENT, @@IDENTITY, SCOPE_IDENTITY에 의해 반환되는 서로 다른 ID 값을 설명하는 예제입니다.

USE pubs
DROP TABLE t6
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   * FROM t6
—id is empty.

SELECT   * FROM t7
—id is empty.

—Do the following in Session 1
INSERT t6 DEFAULT VALUES
SELECT @@IDENTITY    
/*Returns the value 100, which was inserted by the trigger.*/

SELECT SCOPE_IDENTITY() 
/* Returns the value 1, which was inserted by the
INSERT stmt 2 statements before this query.*/

SELECT IDENT_CURRENT(‘t7’)
/* Returns value inserted into t7, i.e. in the trigger.*/

SELECT IDENT_CURRENT(‘t6’)
/* Returns value inserted into t6, which was the INSERT statement 4 stmts before this query.*/

—Do the following in Session 2
SELECT @@IDENTITY
/* Returns NULL since there has been no INSERT action
so far in this session.*/

SELECT SCOPE_IDENTITY()
/* Returns NULL since there has been no INSERT action
so far in this scope in this session.*/

SELECT IDENT_CURRENT(‘t7’)
/* Returns the last value inserted into t7.*/

Advertisements

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu