Insérer une plage de nombres à partir d'un appel à sp_sequence_get_range
-
26-09-2020 - |
Question
Étant donné le code suivant :
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;
J'obtiens un résultat comme ceci :
FirstVal LastVal SeqIncrement
------- ------- --------------
38 50 2
j'aimerais avoir un basé sur un ensemble façon de prendre ces résultats et d'insérer chaque valeur (en sautant par SeqIncrement) dans ce tableau :
DECLARE @newIds TABLE (IdType VARCHAR(100), [NewId] BIGINT)
Alors quand j'ai fini, un SELECT * from @newIds
retournerais:
IdType NewId
------- -------
TestId 38
TestId 40
TestId 42
TestId 44
TestId 46
TestId 48
TestId 50
NOTE:Je ne veux pas utiliser de boucle si possible.De plus, j'aurai besoin d'obtenir un nombre variable de résultats (celui-ci en affiche 7, mais cela changera à chaque appel).
Je pense qu'il peut y avoir une application croisée ou quelque chose du genre qui peut faire cela.Mais je n'arrive pas à comprendre.
La solution
Cela devrait aller jusqu'à environ 2 500 valeurs (selon la version) :
;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;
Si vous avez besoin de plus ou si vous craignez d'utiliser la vue master.dbo.spt_values
, voir d'autres techniques possibles pour générer des groupes sans boucle ici :