Вставте за допомогою OUTPUT, пов'язаного з таблицею підзапитів


22

Я змінюю структуру бази даних. Вміст декількох стовпців таблиці Фінансова установа повинен бути переданий у таблицю Особа . Фінансова установа пов'язана з Особою із іноземним ключем. Кожна фінансова установа потребує посвідчення особи відповідної особи. Отже, для кожного нового рядка, вставленого в Person, ідентифікатор цього нового рядка (IDENTITY) повинен бути скопійований назад у відповідний рядок FinancialInstitution.

Очевидним способом цього є ітеративний код T-SQL. Але мені цікаво дізнатись, чи можна це робити лише за допомогою операцій на основі заданих операцій.

Я уявляв, що внутрішній рівень такого запиту буде чимось таким:

INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;

На жаль, схоже, що OUTPUT не може співвіднести це…


Ви хочете вставити рядки в таблицю Person? Або оновити існуючі? Або ви хочете вставити Personі потім UPDATE FinancialInstitution?
— ypercubeᵀᴹ

Ваш запит оновлює лише таблицю Person. Ви можете зафіксувати вставлений.ID, але не FinancialInstitution.ID, якщо ви не використовуєте його у частині вставки. У тому випадку, як відповідає ваш запит, якщо ви видалили пункт OUTPUT, ви отримаєте помилку, оскільки кількість стовпців у вашому вкладенні INSERT не відповідає оператору SELECT.
— datagod

ypercube: Я хочу вставити в Person, а потім оновити FinancialInstitution з ідентифікатором нового рядка в Person.
— Юго Амаріл

datagod: Я знаю лише його оновлення, цей запит є вкладеним рівнем майбутнього рішення. Але я вже застряг там. Правильно, я не можу додати Id до виділення, якщо не вставляю його.
— Юго Амаріл

1
@YugoAmaryl, ви можете спробувати прийняти цей приклад, використовуючи пункт OUTPUT для
— фіксації

Відповіді:


18

Я думаю, ви могли б (аб) використовувати MERGEдля цього. Спочатку створіть (тимчасову) таблицю:

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Потім MERGEу Person(замість INSERT), так що ви можете використовувати стовпці таблиць, задіяних у OUTPUTпункті:

MERGE INTO Person 
USING FinancialInstitution AS fi
  ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (Street1, Number1, City1, ...)
  VALUES (fi.Street, fi.Number, fi.City, ...)
OUTPUT inserted.Id, fi.Id
  INTO tempIDs ;

Потім використовуйте таблицю темп для UPDATE FinancialInstitution:

UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
  JOIN tempIDs AS t
    ON fi.Id = t.FinancialInstitutionId ; 

Тест за адресою: SQL-Fiddle

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