Inserte un rango de números de una llamada a SP_EQUEnce_Get_Range
-
26-09-2020 - |
Pregunta
Dado el siguiente código:
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;
Recibo un resultado como este:
FirstVal LastVal SeqIncrement
------- ------- --------------
38 50 2
Me gustaría tener una forma establecida basada para tomar estos resultados e insertar cada valor (omitiendo por seqincrement) en esta tabla:
DECLARE @newIds TABLE (IdType VARCHAR(100), [NewId] BIGINT)
Entonces, cuando termine, un SELECT * from @newIds
volvería:
IdType NewId
------- -------
TestId 38
TestId 40
TestId 42
TestId 44
TestId 46
TestId 48
TestId 50
NOTA: No quiero usar un bucle si es posible.Además, necesitaré obtener una cantidad variable de resultados (este muestra 7, pero cambiará cada llamada).
Creo que puede haber una cruz aplicar o algo así que puede hacer esto.Pero parece que no puedo entenderlo.
Solución
Esto debería ser bueno hasta aproximadamente 2,500 valores (dependiendo de la versión):
;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 necesita más, o está preocupado por usar la vista master.dbo.spt_values
, consulte otras técnicas posibles para generar conjuntos sin bucle aquí: