2013-07-03 4 views
2

가 여기 내 샘플 테이블, 기본 키는 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 문을 가지고 끔찍한 보인다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

블라드가 제공하는 해결책은 갈 길이 멀다. 그러나 동적 SQL을 나중에 사용해야하는 경우 EXEC 대신 [sp_executesql] (http://msdn.microsoft.com/en-us/library/ms188001.aspx)을 사용해야합니다. – kheld

답변

0

이 그것을 수행해야합니다

INSERT TABLEA 
SELECT NEXT VALUE FOR ASequence OVER(ORDER BY Something) as AKey, 
    Bkey, Seq 
FROM TABLEB 
+0

코드를 사용해 보셨습니까? 이 방법으로는 작동하지 않습니다. NEXT VALUE의 OVER 절은 정렬에만 적용됩니다. 행 단위로 순서가 적용되는 순서를 지정합니다. 내 질문에 설명 된대로 세트 당 1 개의 값을 제공하는 시퀀스가 ​​필요합니다. 많은 연구 끝에 나는 이것이 내가 상세히 설명한 방식 이외에 가능하지 않다는 결론을 내렸다. 나는 누군가가 나의 발견에서 나를 틀리게 증명할 수 있기를 바랬다. 첫 글래스에서는 NEXT VALUE가 이런 방식으로 작동하고 또한 논리적 특징처럼 보일 것이라고 생각할 것입니다. – Jeff

+0

sp_sequence_get_range가 동적 DDL보다 나을지 확인하십시오. 어느 경우이든이 코드는 여러 연결에서 동시에 실행할 때 잘못된 결과를 생성합니다. –

+0

AKey가 순위 그룹당 또는 레코드 당 증가 할 경우 왜 걱정합니까? TableA의 PK로 취급하고 곧은 ID (또는 시퀀스)를 사용할 수 있습니까? –

0

을 또는 어떻게 이것에 대해 :

CREATE TABLEA 
(
    GroupID INT, 
    AKey INT, 
    BKey INT, 
    ItemSequence INT, 
    CONSTRAINT PK_TABLEA PRIMARY KEY CLUSTERED 
    (
     GroupID, 
     AKey, 
     BKey 
    ) 
) 

DECLARE @GroupID INT 
SET @GroupID = NEXT VALUE FOR ASequence 

INSERT TABLEA 
SELECT @GroupID, DENSE_RANK() OVER (ORDER BY Something) as AKey, 
    Bkey, Sequence 
FROM TABLEB 

하고 당신의 예에서와 같이 당신이 A 키의 값을 필요로하는 경우, 당신이 할 수있는 그룹 ID + A 키 이리.