문제

다음과 같은 코드:

CREATE SEQUENCE dbo.NextTestId AS [bigint]
 START WITH 10 INCREMENT BY 2 NO CACHE 
GO

DECLARE  
  @variableNumberOfIdsNeeded INT = 7, -- This will change for each call
  @FirstSeqNum SQL_VARIANT , @LastSeqNum sql_variant, @SeqIncr sql_variant;  

EXEC sys.sp_sequence_get_range @sequence_name = N'dbo.NextTestId', 
            @range_size = @variableNumberOfIdsNeeded, 
            @range_first_value = @FirstSeqNum OUTPUT, 
            @range_last_value = @LastSeqNum OUTPUT, 
            @sequence_increment = @SeqIncr OUTPUT;

-- The following statement returns the output values
SELECT @FirstSeqNum AS FirstVal, @LastSeqNum AS LastVal, @SeqIncr AS SeqIncrement;

내가 결과를 얻을 다음과 같다:

FirstVal    LastVal    SeqIncrement 
-------     -------    -------------- 
38          50         2

하고 싶가 을 기반으로 설정 방법 이러한 결과를 삽입하고 각 가치(으로써 문제를 해결 SeqIncrement)으로 이 테이블:

DECLARE @newIds TABLE (IdType VARCHAR(100), [NewId] BIGINT)

그 때 내가 완료되면, SELECT * from @newIds 반환:

IdType    NewId
-------   -------
TestId    38
TestId    40
TestId    42
TestId    44
TestId    46
TestId    48
TestId    50

참고:나는 원하지 않을 사용하여 반복 가능한 경우.또한,나를 얻기 위해 필요한 변수량의 결과(이 하나의 쇼 7 지만,그것을 변경한 각 호출).

나는 생각이 있을 수 있습 십자가 적용 또는 일부를 할 수 있는 것은 이것을 할 수 있습니다.하지만 그럴 수 없는 것 그것을 그림.

도움이 되었습니까?

해결책

이어야 좋을까 약 2,500 값(에 따라 버전):

;WITH x(n) AS 
(
  SELECT TOP (@variableNumberOfIdsNeeded)
    (ROW_NUMBER() OVER (ORDER BY number)-1) 
    * CONVERT(BIGINT, @SeqIncr)
    + CONVERT(BIGINT, @FirstSeqNum)
  FROM master.dbo.spt_values
  ORDER BY number
)
--INSERT @newIds([NewId]) 
SELECT n FROM x;

당신이 더 필요한 경우,또는 걱정을 사용하여 보기 master.dbo.spt_values, 참조하십시오 다른 가능한 기술을 위한 세트를 생성하지 않고 반복 여기:

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top