Вопрос по sql-server-2005, sql, insert – Как использовать предложение OUTPUT оператора INSERT, чтобы получить значение идентификатора?

208

Если у меня есть оператор вставки, такой как:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

Как мне установить@var INT к значению идентичности новой строки (называетсяId) используя предложение OUTPUT? Я, например, видел примеры размещения INSERTED.Name в табличных переменных, но я не могу получить его в не табличной переменной.

Я пыталсяOUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, но ни один не работал.

Мой вопросspecifically asks для предложения OUTPUT. Yatrix
Я уже знаю о @@ SCOPE_IDENTITY, особенно хочу узнать, как это сделать с OUPUT. Благодарю. Yatrix
OUTPUT clause должен выводить в таблицу или табличную переменную .. mellamokb
Вам нужно вставить его в табличную переменную, а затем выбрать из этого. Нет синтаксиса для непосредственного присвоения скалярной переменной изOUTPUT пункт. Martin Smith
OUTPUT пункт пишет в таблицу. Это может быть табличная переменная, временная таблица, .... HABO

Ваш Ответ

1   ответ
402

Вы можете получить только что вставленный ID, выводимый на консоль SSMS следующим образом:

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

Вы можете использовать это также, например, C #, когда вам нужно получить идентификатор обратно в вызывающее приложение - просто выполните SQL-запрос с.ExecuteScalar() (вместо.ExecuteNonQuery()) прочитать полученныйID назад.

Или если вам нужно захватить недавно вставленныйID внутри T-SQL (например, для дальнейшей обработки) вам нужно создать переменную таблицы:

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

Таким образом, вы можете поместить несколько значений в@OutputTbl и делать дальнейшую обработку на тех. Вы также можете использовать & quot; обычный & quot; временная таблица (#temp) или даже «реальный» постоянная таблица в качестве вашей «выходной цели» Вот.

Вы можете вставить результат вreal persistent table - это невероятно, потому что это означает, что вы можетеINSERT информация вTWO столы одновременно.
@EricBishardSCOPE_IDENTITY() лучше работает для этого.
Никогда не используйте @@ IDENTITY, чтобы тянуть сверху. Вычеркните трудный путь работы с триггерами, и, поскольку они записывали историю изменений, внесенных в одну таблицу, и одновременно вставляли их в новую таблицу, @@ IDENTITY начал возвращать обратно значения из таблицы истории. оттуда вытекает веселье! Пожалуйста, используйте marc_s & apos; решение. В настоящее время я использую метод @OutputTbl, но я заинтригован другими вариантами.
Ответ здесь для кода был кратким. ExecuteScalar () FTW
OUTPUT INTO чрезвычайно фантастичен, за исключением того, что «таблица назначения предложения OUTPUT INTO не может быть по обе стороны от отношения (первичный ключ, внешний ключ)», что для меня составляет около 99% потенциальных случаев использования. Я предполагаю, что это потому, что предложение OUTPUT может возвращать данные, даже когда транзакция откатывается, но это немного раздражает, так сложно вставить данные в связанные таблицы A и B за один раз.

Похожие вопросы