Sql-Server
從對 sp_sequence_get_range 的呼叫中插入一系列數字
給定以下程式碼:
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)
所以當我完成後, a
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
,請在此處查看其他可能的生成集而不循環的技術: