質問

次のコードを考える:

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
.

私はこれらの結果を取り、各値を挿入するためのセットベースのの方法をこのテーブルに挿入したいと思います:

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;
.

もっと必要な場合、またはView master.dbo.spt_valuesの使用について心配している場合は、ここでループなしでセットを生成するための他の可能なテクニックを参照してください。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top