Создание последовательности в Sql Server - PullRequest
5 голосов
/ 01 декабря 2009

Я хочу создать последовательность чисел в SQL Server, которая будет иметь минимальное и максимальное значение. Я хочу зациклить, если число достигает максимального предела. Может ли какое-нибудь тело помочь мне ??

Ответы [ 4 ]

2 голосов
/ 25 февраля 2010

Нет необходимости в цикле while. Во-первых, вам нужна таблица Tally or Numbers:

Create Table dbo.Numbers ( Value int not null Primary Key Clustered )
GO
With Nums As
    (
    Select Row_Number() Over( Order By S1.object_id ) As Num
    From sys.columns as s1
        cross join sys.columns as s2
    )
Insert dbo.Numbers( Value )
Select Num
From Nums
Where Num <= 100000

Я поместил в таблицу только 100К чисел, но вам может понадобиться больше Вам нужно заполнить эту таблицу только один раз. Теперь вы можете создать любую последовательность, какую пожелаете. Вот так:

Select Value
From dbo.Numbers
Where Value Between @Start And @End

Хотите увеличить значение?:

Select Value
From dbo.Numbers
Where Value % @Increment = 0
1 голос
/ 29 сентября 2016

Начиная с SQL Server 2012, последовательности были добавлены и предположительно быстрее, чем IDENTITY.

Быстрый пример использования опции CYCLE в качестве запроса вопросов, но большинство людей, вероятно, не будут использовать CYCLE, потому что они будут использовать его для синтетического первичного ключа.

CREATE SEQUENCE Schema.SequenceName
AS int
INCREMENT BY 1 
CYCLE;

Вот синтаксис SQL , взятый из MSDN :

CREATE SEQUENCE [schema_name . ] sequence_name  
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]  
    [ START WITH <constant> ]  
    [ INCREMENT BY <constant> ]  
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]  
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]  
    [ CYCLE | { NO CYCLE } ]  
    [ { CACHE [ <constant> ] } | { NO CACHE } ]  
    [ ; ]  

Вот как это сделать в графическом интерфейсе. Это эквивалент быстрого примера, приведенного выше без опции CYCLE , проверенной, поскольку большинство людей не будет использовать это:

  1. В Обозревателе объектов разверните папку Программируемость
  2. В папке Программируемость щелкните правой кнопкой мыши на Последовательности папка, как показано ниже:

enter image description here

  1. Подчеркнуты значения, которые вы бы обновили, чтобы получить эквивалент оператора SQL выше, однако, я бы рассмотрел меняя их в зависимости от ваших потребностей (см. примечания ниже).

enter image description here

Примечания:

0 голосов
/ 11 августа 2011

Вот код, который работает в SQL 2000:

DECLARE @NumRows int;
SET @NumRows = 10000;
DECLARE @t table (RowNum int not null primary key);

-- Seed
INSERT @t VALUES(1)

WHILE @@ROWCOUNT > 0
BEGIN
    INSERT @t
     SELECT     t.RowNum + x.MaxRowNum FROM @t t
     CROSS JOIN 
     (SELECT    MAX(RowNum) MaxRowNum FROM @t) x
     WHERE      t.RowNum <= @NumRows - x.MaxRowNum
END

Адаптировано из этого: Др. Мастерская Тома: генерация порядковых номеров

0 голосов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...