Как использовать предложение OUTPUT оператора INSERT, чтобы получить значение идентификатора?

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

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, но ни один не работал.

 Martin Smith12 июн. 2012 г., 17:07
Вам нужно вставить его в табличную переменную, а затем выбрать из этого. Нет синтаксиса для непосредственного присвоения скалярной переменной изOUTPUT пункт.
 Yatrix12 июн. 2012 г., 17:04
Я уже знаю о @@ SCOPE_IDENTITY, особенно хочу узнать, как это сделать с OUPUT. Благодарю.
 HABO12 июн. 2012 г., 17:07
OUTPUT пункт пишет в таблицу. Это может быть табличная переменная, временная таблица, ....
 Yatrix30 сент. 2016 г., 20:33
Мой вопросspecifically asks для предложения OUTPUT.
 mellamokb12 июн. 2012 г., 17:07
OUTPUT clause должен выводить в таблицу или табличную переменную ..

Ответы на вопрос(1)

Решение Вопроса

Вы можете получить только что вставленный 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) или даже «реальный» постоянная таблица в качестве вашей «выходной цели» Вот.

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

Ваш ответ на вопрос