В хранимой процедуре (SQL Server 2008 R2 SP2) можно ли вернуть 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()?

гео

ОБНОВЛЕНИЕ. Я не уверен, почему Microsoft решила реализовать этот метод таким образом, поскольку они заявляют, что «NEWSEQUENTIALID является оболочкой над функцией Windows UuidCreateSequential»… но похоже, что нет невременной переменной. табличный метод. (По крайней мере, пока.)
Спасибо всем за комментарии и ответы. [Примечание модератора:] Я не знаю, что делать с вопросом, если ответ "невозможно". Поэтому я собираюсь отдать должное @marc_s за подробное описание обходного пути.


person George 2.0 Hope    schedule 12.08.2012    source источник
comment
Ответ - нет. Можете ли вы объяснить, что вы пытаетесь сделать? Возможно, есть лучшее решение.   -  person Gordon Linoff    schedule 12.08.2012
comment
Мне нужно вернуть guid, созданный новой записью в sproc, в вызывающую программу.   -  person George 2.0 Hope    schedule 12.08.2012


Ответы (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 — сохраняются в этой табличной переменной, и вы можете использовать ее, возвращать, нарезать — что угодно!

person marc_s    schedule 12.08.2012
comment
newsequentialid() используется в определении таблицы для значения столбца ПО УМОЛЧАНИЮ. Мне нужно вернуть guid, созданный новой записью в sproc, в вызывающую программу. - person George 2.0 Hope; 12.08.2012

официальное высказывание Microsoft:

NEWSEQUENTIALID() можно использовать только с ограничениями DEFAULT для столбцов таблицы с типом uniqueidentifier. Например: CREATE TABLE myTable (уникальный идентификатор ColumnA DEFAULT NEWSEQUENTIALID())

описано здесь http://msdn.microsoft.com/en-us/library/ms189786.aspx

NewID генерирует случайное число, а другое — следующее по порядку число.

person soynerdito    schedule 12.08.2012