Sql-Server

從對 sp_sequence_get_range 的呼叫中插入一系列數字

  • June 29, 2015

給定以下程式碼:

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)

所以當我完成後, aSELECT * 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,請在此處查看其他可能的生成集而不循環的技術:

引用自:https://dba.stackexchange.com/questions/105447