В хранимой процедуре (SQL Server 2008 R2 с пакетом обновления 2) можно ли вернуть NewSequentialID() без переменной временной таблицы?
В хранимой процедуре (с использованием SQL Server 2008 R2 SP2) можно вернуть NewSequentialID()
без переменной временной таблицы?
Я могу успешно получить NewSequentialID()
используя временную таблицу:
Получение значения NEWSEQUENTIALID() при вставке
Возможно, я старая школа, но я стараюсь воздерживаться от использования временных таблиц, если это не является абсолютно необходимым... хотя это может быть в случае, когда это абсолютно необходимо...
Если я пытаюсь:
DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWID()
... это работает, как ожидалось.
Если я пытаюсь:
DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWSEQUENTIALID()
… Я получаю следующую ошибку:
Встроенная функция newsequentialid() может использоваться только в выражении DEFAULT для столбца типа "uniqueidentifier" в операторе CREATE TABLE или ALTER TABLE. Его нельзя объединить с другими операторами для формирования сложного скалярного выражения.
- Является ли ЕДИНСТВЕННОЕ решение использовать метод временных таблиц?
- Кто-нибудь знает причину, почему Microsoft реализовала разницу между
NEWSEQUENTIALID()
работать какNEWID()
? - Кто-нибудь знает, есть ли шанс, что Microsoft обновит
NEWSEQUENTIALID()
работать какNEWID()
?
Geo
ОБНОВЛЕНИЕ - я не уверен, почему Microsoft решила реализовать метод таким способом, так как они утверждают, что "NEWSEQUENTIALID является оберткой над функцией Windows UuidCreateSequential"... но похоже, что нет не-временной переменной настольный метод. (По крайней мере, пока.)
Спасибо за все комментарии / ответы. [Примечание модератора:] Я не уверен, что делать с вопросом, когда ответ "невозможен". Поэтому я собираюсь отдать должное @marc_s за детализацию обходного пути.
2 ответа
Теперь - newsequentialid()
может использоваться только как ограничение по умолчанию для столбца. Это то, что сообщение об ошибке довольно ясно говорит тоже.
Таким образом, чтобы получить ваш последовательный GUID - у вас должна быть таблица. Другого способа сделать это нет. И другого пути в SQL Server 2012 тоже нет.
Я понятия не имею и не имею никакой информации о том, почему существует такая разница, и почему Microsoft решила реализовать ее таким образом...
Обновить:
Итак, вам нужно получить значение, которое вставляется в вашу таблицу - как насчет использования OUTPUT
пункт?
Что-то вроде:
DECLARE @NewIDs TABLE (NewSeqID UNIQUEIDENTIFIER)
INSERT INTO dbo.YourTable(list-of-columns)
OUTPUT INSERTED.NewSeqID INTO @NewIDs(NewSeqID)
VALUES (.........)
Таким образом, выход из INSERT
Операция - недавно созданные последовательные идентификаторы GUID - сохраняется в этой табличной переменной, и вы можете использовать ее, вернуть ее, нарезать - все что угодно!
Официальная поговорка Microsoft:
NEWSEQUENTIALID () можно использовать только с ограничениями DEFAULT для столбцов таблицы типа uniqueidentifier. Например: CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID())
описано здесь http://msdn.microsoft.com/en-us/library/ms189786.aspx
NewID генерирует случайное число, а другое - следующее последовательное число.