在Sql Server中创建序列

时间:2009-12-01 13:35:24

标签: sql sql-server sequence

我想在SQL Server中创建一个具有最小值和最大值的数字序列。如果数字达到最大限制,我想循环。任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

不需要while循环。首先,您需要一个Tally或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

我只在表格中添加了100K的数字,但您可能需要更多。您只需要填充此表一次。现在您可以创建任何您想要的序列。像这样:

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

想要一个增量值?:

Select Value
From dbo.Numbers
Where Value % @Increment = 0

答案 1 :(得分:1)

从SQL Server 2012开始,序列已添加,并且据称比IDENTITY更快。

使用CYCLE选项作为问题请求的快速示例,但大多数人可能不会使用CYCLE,因为他们会将其用作合成主键。

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

这里是SQL语法taken from 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 } ]  
    [ ; ]  

以下是如何在GUI中执行此操作。这是上面的快速示例的等效项未选中CYCLE选项,因为大多数人不会使用它:

  1. 对象资源管理器中,展开可编程性文件夹
  2. 可编程性文件夹下,右键单击序列 文件夹如下所示:
  3. enter image description here

    1. 下划线是您要更新以获取的值 相当于上面的SQL语句,但是,我会考虑 根据您的需要改变这些(见下面的注释)。
    2. enter image description here

      注意:

      • 默认的“开始”值,“最小值”和“最大值”由数据类型的范围确定,在这种情况下,该数据类型为int。 See here for more info on sequences and ranges
      • 相当不错的机会,你希望你的序列从1和你开始 可能也希望你的最小值为1。

答案 2 :(得分:0)

答案 3 :(得分:0)

以下是一些适用于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

改编自:Dr. Tom's Workshop: Generating Sequence Numbers