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 ...


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.