2014-06-06 1 views
2

테이블에 요소를 삽입하고 삭제하는 중입니다. 결과적으로 새 요소를 삽입하려고 할 때 새 ID 번호가 필요하지만이 ID는 마지막 ID + 1. 예를 들어 : 마지막 ID는 5이고 나는 새로운 ID가, 11의 값을 취할 것 5 개 요소를 삽입하고 그 후 삭제 나는 6 필요 여기에 내 코드신원을 병합 문으로 설정합니다.

CREATE TABLE #FC 
(
    Code varchar(25), 
    Description varchar(50), 
    Category varchar(10), 
    CreatedDate datetime, 
    LastModifiedDate datetime 
); 

--Adding just one record 
INSERT INTO #FC (Code, Description, Category, CreatedDate, LastModifiedDate) 
VALUES   ('DELETE_MEMBER', 'Delete Member', 'POLICY', @Now, @Now); 
; 


SET IDENTITY_INSERT [dbo].[Function_Code] ON; 

MERGE 
    INTO [dbo].[Function_Code] AS T 
    USING #FC AS S 
    ON (T.Code = S.Code) AND (T.Description = S.Description) AND(T.Category = S.Category) 
    WHEN MATCHED THEN 
     UPDATE SET 
      [Code] = S.[Code] 
      , [Description] = S.Description 
      , [Category] = S.Category 
      , [CreatedDate] = S.CreatedDate 
      , [LastModifiedDate] = S.LastModifiedDate 
    WHEN NOT MATCHED THEN 
     INSERT (Code, Description, Category, CreatedDate, LastModifiedDate) 
     VALUES(S.Code, S.Description, S.Category, S.CreatedDate, S.LastModifiedDate) 
; 

SET IDENTITY_INSERT [dbo].[Function_Code] OFF; 
+1

왜 ID에 간격이 없어야 할 필요가 있는지 설명하십시오. –

답변

2

경우 아이디는 기술이다 너 자신을 다루지 말아야 할 분야. 직접 시퀀스를 관리하려면 ID 필드를 사용하지 마십시오. 당신이 정말하고 싶은 경우

그럼에도 불구하고, 당신은 원하는 값으로 테이블을 다시 시드해야합니다 :

DELETE YourTable 

DECLARE @n INT; 
SELECT @n = MAX(YourId) FROM YourTable 
DBCC CHECKIDENT ('YourTable', RESEED, @n) 

INSERT YourTable 
+0

ID가 임시 테이블에 대한 것이 아니며, 원본을위한 것인가? 병합을 만들 때 어떤 부분에서 코드를 삽입하여 접근 방식을 테스트해야합니까? – Zinov

+0

delete 문 다음에 * YourButton *을 * [dbo]로 바꿉니다. [Function_Code] * – jazzytomato

0

당신이 요구하는 어떤 위험하다. 열을 식별 열로 만들면 SQL Server가 해당 작업을 수행하도록 만지십시오. 그렇지 않으면 기본 키 오류를 가져올 수 있습니다. ID 열은 11을 삽입 할 준비가되었습니다. 여러 번 실행하여 6에서 11까지를 코드에 삽입하고 다음에 ID가 행을 테이블에 삽입하려고 할 때 기본 키 오류를 얻을 수 있습니다.

토마스하라 텍스 (Thomas Haratyk)는 귀하의 식탁을 다시 채울 수 있다고 말했습니다. 또는 당신은 사용할 수 있습니다

select MAX(YourId) + 1 FROM YourTable 

당신은 당신이 항상 이미 식별 컬럼에 사용 된 ID를 삽입합니다 확신하는 경우 귀하의 ID 열로 그를 삽입합니다.

그러나 일반적으로 기본 ID 동작을 덮어 쓰는 경우 ID 열에서 삭제하면 기본적으로 간격이 생기기 때문에이 열을 직접 관리하는 것이 좋습니다.

관련 문제