通过调用 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
我想要一个 基于集合 获取这些结果并将每个值(按 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
, ,请参阅此处无需循环即可生成集合的其他可能技术:
不隶属于 dba.stackexchange