呼び出しからSP_SEQUENCE_GET_RANGEへの数値の範囲を挿入する
-
26-09-2020 - |
質問
次のコードを考える:
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
の使用について心配している場合は、ここでループなしでセットを生成するための他の可能なテクニックを参照してください。
所属していません dba.stackexchange