插入来自对 sp_sequence_get_range 的调用的数字范围

Vac*_*ano 3 sql-server sequence sql-server-2012 cross-apply number-table

鉴于以下代码:

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;
Run Code Online (Sandbox Code Playgroud)

我得到这样的结果:

FirstVal    LastVal    SeqIncrement 
-------     -------    -------------- 
38          50         2
Run Code Online (Sandbox Code Playgroud)

我想要一种基于集合的方法来获取这些结果并将每个值(通过 SeqIncrement 跳过)插入到该表中:

DECLARE @newIds TABLE (IdType VARCHAR(100), [NewId] BIGINT)
Run Code Online (Sandbox Code Playgroud)

所以当我完成后, aSELECT * from @newIds会返回:

IdType    NewId
-------   -------
TestId    38
TestId    40
TestId    42
TestId    44
TestId    46
TestId    48
TestId    50
Run Code Online (Sandbox Code Playgroud)

注意:如果可能,我不想使用循环。另外,我需要获得不同数量的结果(这个显示 7 个,但每次调用都会改变)。

我认为可能有交叉申请或一些可以做到这一点的事情。但我似乎想不通。

Aar*_*and 5

这应该可以达到大约 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;
Run Code Online (Sandbox Code Playgroud)

如果您需要更多,或者担心使用 view master.dbo.spt_values,请在此处查看其他可能的无需循环生成集合的技术: