أدخل نطاقًا من الأرقام من مكالمة إلى 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، لكنه سيغير كل مكالمة).
أعتقد أنه قد يكون هناك تطبيق متقاطع أو شيء من هذا القبيل يمكنه القيام بذلك.ولكن يبدو أنني لا أستطيع أن أفهم ذلك.
المحلول
يجب أن يصل هذا إلى حوالي 2500 قيمة (حسب الإصدار):
;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