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(‘테이블명’) 을 사용하자.
'MSSQL' 카테고리의 다른 글
로그파일 축소 (0) | 2012.07.22 |
---|---|
with(updlock) 케이스별 테스트 (0) | 2012.01.26 |
(펌) MSSQL Identity 자동 증가함수 (0) | 2012.01.20 |
(펌) T_SQL 같은 그룹의 데이터를 붙여서 출력하기 (0) | 2011.12.27 |
T-SQL) group by 결과를 가로로 출력 (0) | 2011.12.27 |