Як я можу використовувати застереження про вихід INSERT заяви OUTPUT, щоб отримати значення ідентичності?


240

Якщо у мене є вставка заяви, наприклад:

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але не працював.


3
Я вже знаю про @@ SCOPE_IDENTITY, я спеціально хочу знати, як це зробити з OUPUT. Дякую.
Ятрікс

6
Вам потрібно вставити його в змінну таблиці, а потім вибрати з неї. Немає синтаксису для присвоєння скалярної змінної безпосередньо з OUTPUTпункту.
Мартін Сміт

3
Пункт OUTPUT повинен виводити в змінну таблиці або таблиці ..
mellamokb

5
OUTPUTПункт записує в таблицю. Це може бути таблична змінна, тимчасова таблиця, ....
HABO

2
У моєму питанні конкретно задається пункт OUTPUT.
Ятрікс

Відповіді:


464

Ви можете мати так, щоб щойно вставлений ідентифікатор виводився на консоль 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і зробити подальшу обробку на них. Тут ви також можете використовувати "звичайну" тимчасову таблицю ( #temp) або навіть "реальну" стійку таблицю як свою "вихідну ціль".


2
Відповідь на код, який стояв позаду, був стислим. ExecuteScalar () FTW
Джо Джонстон

10
Ви можете вставити результат у real persistent table- це надзвичайно фантастично, оскільки це означає, що ви можете одночасно INSERTвносити інформацію в TWOтаблиці.
gotqn

7
Ніколи не використовуйте @@ IDENTITY, щоб тягнути зверху. Виявив складний спосіб роботи з тригерами, і оскільки вони записували історію змін, внесених до однієї таблиці, і одночасно вставляли їх у нову таблицю @@ IDENTITY, почали повертати значення з таблиці історії. веселість випливає звідти! Будь ласка, використовуйте рішення marc_s. на даний момент я пішов із методом @OutputTbl, але мене зацікавили інші варіанти.
Ерік Бішард

4
OUTPUT INTO є надзвичайно фантастичним, за винятком того, що "цільова таблиця пункту OUTPUT INTO не може бути з обох боків (первинний ключ, зовнішній ключ)", що для мене становить приблизно 99% випадків потенційного використання. Я припускаю, що це тому, що пункт OUTPUT може повертати дані навіть тоді, коли транзакція повертається назад, але це трохи дратує, що так важко вставити дані в відповідні таблиці A і B за один кадр.
Роберт Калхун

3
@EricBishard SCOPE_IDENTITY()для цього краще працює.
Дірк Деррека
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.