这是我的示例表,主键是 Akey+Bkey 的复合键
Akey Bkey ItemSequence ---- ---- ------------ 1 1 1 1 5 2 1 7 3 2 7 1 3 2 1 3 3 2
Akey 是从 SQL 2012 序列对象 ASequence 生成的。在大多数情况下,我一次插入一行,必要时我调用 NEXT VALUE FOR ASequence。但是我需要从如下语句中插入:
SELECT DENSE_RANK() OVER ( ORDER BY Something) 作为 AKey, Bkey,序列 从表 B
NEXT VALUE 的 OVER 子句不能以这种方式工作,因为我需要能够将记录作为 SET 插入,但每个 DENSE_RANK 集只增加一次序列。所以我们有 ALTER SEQUENCE 命令,通过它我可以将序列设置为我想要的。需要注意的是,它必须是一个常量,并且不接受变量。我的解决方法是:
声明 @startingID INT 声明 @sql VARCHAR(MAX) 声明@newSeed INT SET @startingID = ASequence 的下一个值 插入表格 SELECT DENSE_RANK() OVER ( ORDER BY Something) + @startingID 作为 AKey, Bkey,序列 从表 B 从表中选择 @newSeed = MAX(Akey) SET @sql = 'ALTER SEQUENCE ASEQUENCE RESTART WITH ' + cast(@newSeed+1 as varchar(10)) 执行(@sql)
像这样在动态 SQL 中使用 DML 语句似乎很糟糕。有一个更好的方法吗?