这是我的试样台,主键是由SQL 2012 Sequence对象ASequence生成的A密钥+ B密钥SQL Server 2012的序列对象
Akey Bkey ItemSequence ---- ---- ------------ 1 1 1 1 5 2 1 7 3 2 7 1 3 2 1 3 3 2
A密钥的组合密钥。在大多数情况下,我一次插入一行,必要时我称之为序列的下一个值。不过,我需要从类似的声明做插入:
SELECT DENSE_RANK() OVER (ORDER BY Something) as AKey, Bkey, Sequence FROM TABLEB
下一个值的OVER子句,因为我需要能够插入记录为一组,但只增加序列一次每不起作用这种方式DENSE_RANK集。 所以我们有了ALTER SEQUENCE命令,并且可以将序列设置为我想要的。对此的警告是它必须是一个常量,并且不会接受一个变量。我的解决方法是:
DECLARE @startingID INT DECLARE @sql VARCHAR(MAX) DECLARE @newSeed INT SET @startingID = NEXT VALUE FOR ASequence INSERT TABLEA SELECT DENSE_RANK() OVER (ORDER BY Something) + @startingID as AKey, Bkey, Sequence FROM TABLEB SELECT @newSeed = MAX(Akey) FROM TABLEA SET @sql = ‘ALTER SEQUENCE ASEQUENCE RESTART WITH ‘ + cast(@newSeed+1 as varchar(10)) EXEC(@sql)
似乎在Dynamic SQL中有这样的DML语句可怕。有一个更好的方法吗?
弗拉德提供的解决方案是要走的路。但是,如果将来必须使用动态SQL,请务必使用[sp_executesql](http://msdn.microsoft.com/zh-cn/library/ms188001.aspx)而不是EXEC。 – kheld