가 여기 내 샘플 테이블, 기본 키는 SQL 2012 시퀀스 객체 ASequence에서 생성 된 A 키 + B 키SQL 서버 2012 시퀀스 개체
Akey Bkey ItemSequence ---- ---- ------------ 1 1 1 1 5 2 1 7 3 2 7 1 3 2 1 3 3 2
A 키의 복합 키입니다. 대부분의 경우 한 번에 한 행을 삽입하고 필요한 경우 NEXT VALUE for ASequence를 호출합니다. 나는 SET로 레코드를 삽입 할 수 있지만 당 한 번 순서를 증가해야하므로이 방법을 작동하지 않습니다
SELECT DENSE_RANK() OVER (ORDER BY Something) as AKey, Bkey, Sequence FROM TABLEB
다음 값의 OVER 절 : 그러나 나는 같은 문에서 삽입을 할 필요가 DENSE_RANK가 설정되었습니다. 그래서 우리는 ALTER SEQUENCE 명령을 가지고 있고 이것으로 원하는대로 시퀀스를 설정할 수 있습니다. 이 문제는 상수 여야하며 변수를 허용하지 않는다는 점에서주의해야합니다. 이 내 문제를 해결했다 :
DECLARE @startingID INT DECLARE @sql VARCHAR(MAX) DECLARE @newSeed INT SET @startingID = NEXT VALUE FOR ASequence INSERT TABLEA SELECT DENSE_RANK() OVER (ORDER BY Something) + @startingID as AKey, Bkey, Sequence FROM TABLEB SELECT @newSeed = MAX(Akey) FROM TABLEA SET @sql = ‘ALTER SEQUENCE ASEQUENCE RESTART WITH ‘ + cast(@newSeed+1 as varchar(10)) EXEC(@sql)
이 같은 동적 SQL의 DML 문을 가지고 끔찍한 보인다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
블라드가 제공하는 해결책은 갈 길이 멀다. 그러나 동적 SQL을 나중에 사용해야하는 경우 EXEC 대신 [sp_executesql] (http://msdn.microsoft.com/en-us/library/ms188001.aspx)을 사용해야합니다. – kheld