В хранимой процедуре (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 генерирует случайное число, а другое - следующее последовательное число.

Другие вопросы по тегам