Вот мой пример таблицы, первичный ключ является составным ключом Akey + BkeySQL Server 2012 Последовательность объектов
Akey Bkey ItemSequence ---- ---- ------------ 1 1 1 1 5 2 1 7 3 2 7 1 3 2 1 3 3 2
-ключа генерируется из SQL 2012 Sequence объекта нарушение проводимости. В большинстве случаев я вставляю одну строку за раз, и при необходимости я вызываю NEXT VALUE FOR ASequence. Однако мне нужно сделать вставку из заявления, как:
SELECT DENSE_RANK() OVER (ORDER BY Something) as AKey, Bkey, Sequence FROM TABLEB
Оговорка OVER следующего значения не работает так, как мне нужно, чтобы иметь возможность вставлять записи как SET, но только приращение последовательности один раз в Установлен 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)
Ужасно иметь инструкции DML в Dynamic SQL, подобные этому. Есть лучший способ сделать это?
Решение, предоставленное Владом, - это путь. Однако, если вы ДОЛЖНЫ использовать динамический SQL в будущем, обязательно используйте [sp_executesql] (http://msdn.microsoft.com/en-us/library/ms188001.aspx) вместо EXEC. – kheld