binary파일 을 저장하는 테이블을 만들려고 하는게 이게 1:1 이 아니다 보니 데이터테이블 이름과 데이터테이블의 seq_no(identity)로
파일 저장테이블을 update 나 insert하려고 합니다.
제가 생각해놓은 프로시저가 아래와 같은데.. 문제점은 이렇게 IDENTITY를 가져옵니다.
SET @SET_IDENTITY = (SELECT IDENT_CURRENT('CONT_CONTRACT'))
새값을 입력하고 IDENTITY값져오기 중간에 IDENTITY값을 가져온 직후 다른유저가 새로운 열을 insert하면 identity의 값이 틀어지나요 아니면 실행시점 그대로 인가요?
1. identity 1값을 가진 열생성
2. 다른유저가 identity 2를 가진 열생성
3. 파일테이블에 identity 를 참조하여 열을 수정 가져옴(이때 1.3이 같은 프로시저 안에서실행되고 있습니다.)
이때가져오는 identity는 프로시저 생성시점은 1값인가요? 아님 현재 값인 2의 값인가요?
ALTER PROCEDURE [dbo].[YCPKG_BSE010100_CONT_CONTRACT]
@IN_SEQ_NO NVARCHAR(MAX),
@IN_WCODE NVARCHAR(MAX),
@IN_EMP_NO NVARCHAR(MAX),
@IN_CONT_DATE NVARCHAR(MAX),
@IN_CONT_EXPIR_DATE NVARCHAR(MAX),
@IN_CONT_NO NVARCHAR(MAX),
@IN_CONT_DESC NVARCHAR(MAX),
@IN_CONT_STATE NVARCHAR(MAX),
@IN_CONT_PERIOD NVARCHAR(MAX),
@IN_FILE_NAME NVARCHAR(MAX),
@IN_FILE_BINARY varbinary(MAX),
@IN_ID NVARCHAR(MAX)
AS
BEGIN
DECLARE @IN_HID NVARCHAR(MAX),
@SET_IDENTITY int
SET NOCOUNT ON;
BEGIN TRAN
SET @IN_HID = dbo.FN_GET_HID(@IN_WCODE, @IN_EMP_NO)
MERGE INTO CONT_CONTRACT A USING (
SELECT @IN_SEQ_NO AS SEQ_NO ,
@IN_HID AS HID,
@IN_CONT_DATE AS CONT_DATE,
@IN_CONT_EXPIR_DATE AS CONT_EXPIR_DATE,
@IN_CONT_NO AS CONT_NO,
@IN_CONT_DESC AS CONT_DESC,
@IN_CONT_STATE AS CONT_STATE,
@IN_CONT_PERIOD AS CONT_PERIOD
) B ON (B.SEQ_NO = A.SEQ_NO)
WHEN MATCHED THEN
UPDATE SET
HID = B.HID,
CONT_DATE = B.CONT_DATE,
CONT_EXPIR_DATE = B.CONT_EXPIR_DATE,
CONT_NO = B.CONT_NO,
CONT_DESC = B.CONT_DESC,
CONT_STATE = B.CONT_STATE,
CONT_PERIOD = B.CONT_PERIOD,
FIN_MDFY_DATE = GETDATE(),
FIN_MDFY_LID = @IN_ID
WHEN NOT MATCHED THEN
INSERT ( HID, CONT_DATE, CONT_EXPIR_DATE, CONT_NO, CONT_DESC, CONT_STATE, CONT_PERIOD, REG_DATE, FIN_MDFY_DATE, REG_LID, FIN_MDFY_LID, DEL_YN)
VALUES ( @IN_HID, @IN_CONT_DATE, @IN_CONT_EXPIR_DATE, @IN_CONT_NO, @IN_CONT_DESC, @IN_CONT_STATE, @IN_CONT_PERIOD, GETDATE(), GETDATE(), @IN_ID, @IN_ID, 'N');
IF EXISTS ( SELECT COUNT(*) FROM CONT_CONTRACT WHERE SEQ_NO = @IN_SEQ_NO)
BEGIN
SET @SET_IDENTITY = @IN_SEQ_NO
END
ELSE
BEGIN
SET @SET_IDENTITY = (SELECT IDENT_CURRENT('CONT_CONTRACT'))
END
IF EXISTS (SELECT COUNT(*) FROM FILE_REPOSITORY WHERE TABLE_NM = 'CONT_CONTRACT' AND TABLE_SEQ_NO = @SET_IDENTITY)
BEGIN
IF(@IN_FILE_BINARY != '')
BEGIN
UPDATE FILE_REPOSITORY
SET [FILE_NAME] = @IN_FILE_NAME
, FILE_BINARY = @IN_FILE_BINARY
, FIN_MDFY_DATE = GETDATE()
, FIN_MDFY_LID = @IN_ID
WHERE TABLE_SEQ_NO = @SET_IDENTITY
END
ELSE
BEGIN
INSERT INTO FILE_REPOSITORY(TABLE_NM, TABLE_SEQ_NO, [FILE_NAME], FILE_BINARY, REG_DATE, FIN_MDFY_DATE, REG_LID, FIN_MDFY_LID, DEL_YN)
VALUES ('CONT_CONTRACT', @SET_IDENTITY, @IN_FILE_NAME, @IN_FILE_BINARY, GETDATE(), GETDATE(), @IN_ID, @IN_ID, 'N');
END
END
COMMIT TRAN
END
Comment 5
-
항해자™
2016.10.12 12:12
-
뽀구
2016.10.12 15:40
답변감사합니다. set @set_identity = scope_identity() 를 사용해보세요.. 를 해보아도 머지문에서 제대로 작동을 안하는건지 0을 반환하네요...
-
항해자™
2016.10.12 17:58
insert 가 발생하고, identity가 증가 했다면 값이 반환 될텐데, 이상하네요,,,
-
뽀구
2016.10.12 18:12
아 답변 감사합니다. 제가 쿼리문을 잘못짯네요 EXSISTS (SELECT COUNT( *) 문이 0로우에서도 있다고 판단을 해버리네요.. 그래서 증가값이 없던것처럼 느꼇던것이네요.. ㅠㅠ.. 해결되었습니다. 감사합니다.
-
항해자™
2016.10.12 23:12
참고로 exists 문에서 count(*) 대신에 1 로 바꾸셔도 됩니다,,,
count(*) -> 1
set @set_identity = scope_identity() 를 사용해보세요,,