Sisipkan dengan OUTPUT yang terkait dengan tabel sub kueri

22

Saya memodifikasi struktur database. Isi beberapa kolom tabel FinancialInstitusi harus ditransfer ke tabel Person . Institusi Keuangan ditautkan dengan Orang dengan kunci asing. Setiap Lembaga Keuangan membutuhkan ID dari Orang yang bersangkutan. Jadi, untuk setiap baris baru yang dimasukkan dalam Person, id dari baris baru ini (IDENTITY) harus disalin kembali ke baris yang sesuai dari FinancialInstitusi.

Cara yang jelas untuk melakukan ini adalah kode T-SQL berulang. Tapi saya tertarik untuk mengetahui apakah mungkin untuk melakukannya hanya dengan operasi berbasis set.

Saya membayangkan tingkat dalam dari permintaan semacam itu adalah:

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;

Sayangnya, sepertinya OUTPUT tidak dapat berkorelasi seperti itu ...

Yugo Amaryl
sumber
Apakah Anda ingin memasukkan baris ke tabel Person? Atau perbarui yang sudah ada? Atau Anda ingin memasukkan ke dalam Personlalu UPDATE FinancialInstitution?
ypercubeᵀᴹ
Permintaan Anda hanya memperbarui tabel Orang. Anda dapat menangkap insert.ID, tetapi bukan FinancialInstitution.ID kecuali Anda menggunakannya di bagian sisipan. Cara kueri Anda duduk, jika Anda menghapus klausa OUTPUT, Anda akan mendapatkan kesalahan karena jumlah kolom dalam pernyataan INSERT Anda tidak cocok dengan pernyataan SELECT.
datagod
ypercube: Saya ingin menyisipkan ke Person dan kemudian Perbarui FinancialInstitusi dengan Id dari baris baru di Person.
Yugo Amaryl
datagod: Saya tahu hanya memperbarui, permintaan ini adalah tingkat bersarang dari solusi masa depan. Tapi saya sudah terjebak di sana. Benar saya tidak bisa menambahkan Id ke dalam seleksi jika saya tidak memasukkannya.
Yugo Amaryl
1
@YugoAmaryl, Anda dapat mencoba untuk mengadopsi contoh ini Menggunakan Klausa OUTPUT untuk Menangkap Nilai Identitas pada Sisipan Multi-Baris
DenisT

Jawaban:

18

Saya kira Anda bisa (ab) gunakan MERGEuntuk ini. Pertama-tama buat tabel (sementara):

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Lalu MERGEke Person(bukan INSERT), jadi Anda bisa menggunakan kolom dari tabel yang terlibat dalam OUTPUTklausa:

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 ;

Kemudian gunakan tabel temp untuk UPDATE FinancialInstitution:

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

Tes di: SQL-Fiddle

ypercubeᵀᴹ
sumber