SQL Server 2008 R2中的SEQUENCE

时间:2014-01-15 21:43:20

标签: sql-server sql-server-2008-r2

我需要知道是否有任何方法可以拥有SEQUENCE或类似的东西,就像我们在Oracle中一样。想法是获取一个数字,然后将其用作关键字以保存表中的一些记录。每次我们需要在该表中保存数据时,首先我们从序列中获取下一个数字,然后我们使用相同的方法来保存一些记录。不是IDENTITY列。

例如:

[ID] [SEQUENCE ID] [Code]  [Value]
1    1             A       232
2    1             B       454
3    1             C       565

下次有人需要添加记录时,下一个SEQUENCE ID应为2,有什么方法可以做到吗?这个序列对我来说也是一个指导。

3 个答案:

答案 0 :(得分:1)

正如Guillelon所指出的,在SQL Server中执行此操作的最佳方法是使用标识列。

您只需将列定义为identity即可。插入新行时,标识会自动递增。

不同之处在于身份在每个行上更新,而不仅仅是某些行。说实话,认为这是一个更好的方法。您的示例表明您将实体和详细信息存储在同一个表中。

SequenceId应该是另一个表中的主要标识密钥。然后可以使用此值插入此表。

答案 1 :(得分:0)

这可以通过多种方式完成,以下是我能想到的

  1. 通过计算可能的值来创建触发器

  2. 添加计算列以及检索序列的下一个值的函数

  3. 这是一个提出各种解决方案的article

答案 2 :(得分:0)

一种可能的方法是做这样的事情:

-- Example 1

DECLARE @Var INT
SET @Var = Select Max(ID) + 1 From tbl;
INSERT INTO tbl VALUES (@var,'Record 1')
INSERT INTO tbl VALUES (@var,'Record 2')
INSERT INTO tbl VALUES (@var,'Record 3')

-- Example 2

INSERT INTO #temp VALUES (1,2)
INSERT INTO #temp VALUES (1,2)

INSERT INTO ActualTable (col1, col2, sequence)
SELECT temp.*, (SELECT MAX(ID) + 1 FROM ActualTable)
FROM #temp temp

-- Example 3

DECLARE @var int
INSERT INTO ActualTable (col1, col2, sequence) OUTPUT @var = inserted.sequence VALUES (1, 2, (SELECT MAX(ID) + 1 FROM ActualTable))

前两个示例依赖于批量更新。但根据您的评论,我添加了示例3,这是最初的单个输入。然后,您可以使用插入的序列插入其余记录。如果您从未使用过输出,请在评论中回复,我会进一步扩展。

我会在交易中隔离以上所有内容。

如果您使用的是SQL Server 2012,则可以使用显示hereSEQUENCE运算符。

请原谅我,如果语法错误,没有安装SSMS