Saya telah membuat beberapa modifikasi pada database saya dan saya perlu memigrasi data lama ke tabel baru. Untuk itu, saya perlu mengisi tabel (ReportOptions) yang mengambil data dari tabel asli (Practice), dan mengisi tabel perantara kedua (PracticeReportOption).
ReportOption (ReportOptionId int PK, field1, field2...)
Practice (PracticeId int PK, field1, field2...)
PracticeReportOption (PracticeReportOptionId int PK, PracticeId int FK, ReportOptionId int FK, field1, field2...)
Saya membuat kueri untuk mendapatkan semua data yang saya butuhkan untuk berpindah dari Praktik ke ReportOptions, tetapi saya mengalami masalah untuk mengisi tabel perantara
--Auxiliary tables
DECLARE @ReportOption TABLE (PracticeId int /*This field is not on the actual ReportOption table*/, field1, field2...)
DECLARE @PracticeReportOption TABLE (PracticeId int, ReportOptionId int, field1, field2)
--First I get all the data I need to move
INSERT INTO @ReportOption
SELECT P.practiceId, field1, field2...
FROM Practice P
--I insert it into the new table, but somehow I need to have the repation PracticeId / ReportOptionId
INSERT INTO ReportOption (field1, field2...)
OUTPUT @ReportOption.PracticeId, --> this is the field I don't know how to get
inserted.ReportOptionId
INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT field1, field2
FROM @ReportOption
--This would insert the relationship, If I knew how to get it!
INSERT INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT PracticeId, ReportOptionId
FROM @ReportOption
Jika saya bisa mereferensikan bidang yang tidak ada di tabel tujuan pada klausa OUTPUT, itu akan bagus (saya pikir saya tidak bisa, tapi saya tidak tahu pasti). Ada gagasan tentang bagaimana memenuhi kebutuhan saya?
sql
sql-server
Alejandro B.
sumber
sumber
OUTPUT
klausa Anda . Jadi, meskipun Anda tidak memberikan nilai untuk kolom tertentu dalamINSERT
pernyataan Anda, Anda masih dapat menentukan kolom tersebut dalamOUTPUT
klausa. Namun Anda tidak dapat mengembalikan variabel atau kolom SQL dari tabel lain.Jawaban:
Anda dapat melakukan ini dengan menggunakan
MERGE
alih-alih menyisipkan:jadi gantilah ini
dengan
Kuncinya adalah menggunakan predikat yang tidak akan pernah benar (1 = 0) dalam kondisi pencarian gabungan, jadi Anda akan selalu melakukan penyisipan, tetapi memiliki akses ke bidang di tabel sumber dan tujuan.
Berikut ini seluruh kode yang saya gunakan untuk mengujinya:
Lebih banyak bacaan, dan sumber dari semua yang saya ketahui tentang masalah ini ada di Sini
sumber
Mungkin seseorang yang menggunakan MS SQL Server 2005 atau yang lebih rendah akan menganggap jawaban ini berguna.
MERGE hanya akan berfungsi untuk SQL Server 2008 atau lebih tinggi. Selebihnya saya menemukan solusi lain yang akan memberi Anda kemampuan untuk membuat jenis tabel pemetaan.
Berikut tampilan Resolusi untuk SQL 2005:
Trik utamanya adalah kita mengisi tabel pemetaan dua kali dengan data yang dipesan dari tabel Sumber dan tujuan. Untuk detail selengkapnya di sini: Menggabungkan Data yang Disisipkan Menggunakan OUTPUT di SQL Server 2005
sumber
Output
sayaInsert
's untuk outputTable
yang mencakupIdentity
nilai dari targetTable
dengan nonInsert
nilai -ed (PK) dari sumberTable
(btw, jadi saya kemudian bisa (dalam Batch yang berbeda) menggunakan outputTable
untuk mengisiColumn
di sumberTable
denganIdentity
nilai). Tanpa aMerge
, saya membayangkan saya harus: a) mulaiTransaction
, b) mendapatkan berikutnyaIdentity
, c) Masukkan ke dalam tempTable
dengan dihitungIdentity
, d) setIdentity_Insert
, e)Insert
ke dalam targetTable
dari tempTable
, f) jelasIdentity_Insert
.