ORACLE에는 sequence가 있듯,
MS SQL에는 자동증가로 IDENTITY가 있다. 하지만 칼럼타입이 int 같은 정수여야만 사용가능하다...
문제는 시퀀스 칼럼타입이 INT가 아니고 varchar타입이다.
(컬럼타입을 바꿔서 해결하면 좋겟지만 현실은 냉정하듯 해당컬럼의 타입을 바꿀수 없는 상황이다.)
그리고 테이블에 동시에 여러 곳에서 입력이 빈번하게 일어난다고 한다. 입력시 키값이 듀플리케이션이 발생한다고 한다.
1. MS SQL 시퀀스 만들기
①. Create a sequence table
CREATE TABLE SEQ_TAB
(
seq_name VARCHAR(64) PRIMARY KEY,
cyclic_yn CHAR(1) NOT NULL,
seq_value INT NOT NULL
)
②. Create a procedure to get sequence number
----------------------------------------------
-- 시퀀스 갖고 오는 프로시저
-- 작업성공이면 0보다 큰 수, 실패면 음수 반환
----------------------------------------------
create procedure sp_get_nextval
@p_seq_name varchar(100),
@v_seq_value int output
as
begin
declare @v_cyclic_yn char(1)
set @v_seq_value = -1
begin transaction trans1
select @v_cyclic_yn = cyclic_yn from seq_tab where seq_name = @p_seq_name
if (@@rowcount = 0)
return @v_seq_value -- 찾는 자료 없음
else
begin
update seq_tab set @v_seq_value = seq_value = seq_value + 1 where seq_name = @p_seq_name
-- 시퀀스가 순환이고, 현재 값이 int의 최대 값이면 0으로 되돌린다.
if (@v_seq_value = 2147483647) and (@v_cyclic_yn = 'y')
begin
update seq_tab set seq_value = 0 where seq_name = @p_seq_name
end
commit transaction trans1
end
return @v_seq_value
end
-- 시퀀스 갖고 오는 프로시저
-- 작업성공이면 0보다 큰 수, 실패면 음수 반환
----------------------------------------------
create procedure sp_get_nextval
@p_seq_name varchar(100),
@v_seq_value int output
as
begin
declare @v_cyclic_yn char(1)
set @v_seq_value = -1
begin transaction trans1
select @v_cyclic_yn = cyclic_yn from seq_tab where seq_name = @p_seq_name
if (@@rowcount = 0)
return @v_seq_value -- 찾는 자료 없음
else
begin
update seq_tab set @v_seq_value = seq_value = seq_value + 1 where seq_name = @p_seq_name
-- 시퀀스가 순환이고, 현재 값이 int의 최대 값이면 0으로 되돌린다.
if (@v_seq_value = 2147483647) and (@v_cyclic_yn = 'y')
begin
update seq_tab set seq_value = 0 where seq_name = @p_seq_name
end
commit transaction trans1
end
return @v_seq_value
end
1. 시간값으로
시간값으로 천분의 일초까지 지정 한후 별도의 sequence 테이블을 생성 201203270900000 + 0000 네자리를 추가한다.
'DB' 카테고리의 다른 글
sysdate (0) | 2013.07.19 |
---|---|
JDBC FailOver (0) | 2012.07.30 |
DB2 rownum - oracle (0) | 2011.09.14 |
테라DB 관련 정보 (0) | 2011.09.14 |
MSSQL TCP/IP 설정 (0) | 2011.09.14 |