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.

Était-ce utile?

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 :

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top