سؤال

نظرا للكود التالي:

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, ، راجع التقنيات الأخرى الممكنة لإنشاء مجموعات بدون تكرار هنا:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى dba.stackexchange
scroll top