본문 바로가기

IT/Database

SCOPE_IDENTITY, IDENT_CURRENT, @@identity 비교

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.*/

'IT > Database' 카테고리의 다른 글

MSSQL MDF 복구법  (0) 2008.10.25
[펌] 오라클 트리거 정리  (0) 2008.06.10
[Oracle] Not In 과 Not exists 차이점  (0) 2008.02.22
[Oracle] Top 쿼리 구현  (3) 2008.02.22
MSDE 2005 로그인 삽질  (0) 2008.02.18