我想在SQL Server中创建一个具有最小值和最大值的数字序列。如果数字达到最大限制,我想循环。任何人都可以帮助我吗?
答案 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
选项,因为大多数人不会使用它:
注意:
答案 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