create table testdb
( a int identity(1,1)
, b varchar(10) default 'test')

-- 데이터가 없을때 idval 값은 1
select * from testdb
select idval = IDENT_CURRENT('testdb')
select isnull(max(a),0) from testdb
-- no data
-- 1
-- 0

insert into testdb default values select @@identity
-- 1
select * from testdb
-- 1 test
select idval = IDENT_CURRENT('testdb')
-- 1
select isnull(max(a),0) from testdb
-- 1

insert into testdb default values select @@identity
-- 2
select * from testdb
-- 1 test
-- 2 test
select idval = IDENT_CURRENT('testdb')
-- 2
select isnull(max(a),0) from testdb
-- 2

insert into testdb values (3,'111')
-- 메시지 8101, 수준 16, 상태 1, 줄 1
-- 테이블 'testdb'에 있는 ID 열의 명시적 값은 열 목록이 사용되고 IDENTITY_INSERT가 ON일 때만 지정할 수 있습니다.

 set identity_insert testtable on;
insert into testtable (col1, col2) select coll1, coll2 from testtable2
--insert할 컬럼을 정확히 명시해야 함
set identity_insert testtable off;


--------------------------------------------------------
@@IDENTITY는 싱글쓰레드에서만 사용해야하는 이유
--------------------------------------------------------

@@IDENTITY와 SCOPE_IDENTITY는 현재 세션의 테이블에서 생성된 마지막 ID 값을 반환합니다. 그러나, SCOPE_IDENTITY는 현재 범위 내에서만 값을 반환합니다. @@IDENTITY는 특정 범위로 제한되지 않습니다.

IDENT_CURRENT는 범위와 세션으로 제한되지 않고, 지정된 테이블로 제한됩니다. IDENT_CURRENT는 임의의 세션과 범위에 있는 특정 테이블에 생성된 ID 값을 반환합니다. 자세한 내용은 IDENT_CURRENT를 참조하십시오.

위의 설명과 같이 @@IDENTITY는 멀티스레드에서 사용할때 엉뚱한 값을 가지고 있을 가능성이 높다.
되도록 IDENT_CURRENT(‘테이블명’) 을 사용하자.


 

+ Recent posts