我需要知道是否有任何方法可以拥有SEQUENCE
或类似的东西,就像我们在Oracle中一样。想法是获取一个数字,然后将其用作关键字以保存表中的一些记录。每次我们需要在该表中保存数据时,首先我们从序列中获取下一个数字,然后我们使用相同的方法来保存一些记录。不是IDENTITY
列。
例如:
[ID] [SEQUENCE ID] [Code] [Value]
1 1 A 232
2 1 B 454
3 1 C 565
下次有人需要添加记录时,下一个SEQUENCE ID应为2,有什么方法可以做到吗?这个序列对我来说也是一个指导。
答案 0 :(得分:1)
正如Guillelon所指出的,在SQL Server中执行此操作的最佳方法是使用标识列。
您只需将列定义为identity
即可。插入新行时,标识会自动递增。
不同之处在于身份在每个行上更新,而不仅仅是某些行。说实话,认为这是一个更好的方法。您的示例表明您将实体和详细信息存储在同一个表中。
SequenceId
应该是另一个表中的主要标识密钥。然后可以使用此值插入此表。
答案 1 :(得分:0)
这可以通过多种方式完成,以下是我能想到的
通过计算可能的值来创建触发器
添加计算列以及检索序列的下一个值的函数
这是一个提出各种解决方案的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,则可以使用显示here的SEQUENCE
运算符。
请原谅我,如果语法错误,没有安装SSMS