menimpa tabel dengan data dari tabel lain - SQL

9

Pengguna kami ingin me-refresh database QA dari produksi tetapi ingin dua tabel (sebut saja mereka T1 dan T2) untuk mempertahankan data QA asli. Jadi saya menyalin dua tabel dari QA (DB1) ke temp temp basis data QA (DB2). Kemudian menyegarkan DB1 dari produksi. Setelah refresh, saya ingin menimpa data T1 dan T2 dari DB2 ke DB1 sehingga dapat berisi nilai QA pre-refresh.

Saya telah melakukan yang berikut:

  1. Menggunakan

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
  2. Kemudian D1 segar dari prod

  3. Kemudian terpotong T1 dengan langkah berikut:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
  4. Sekarang ketika saya kembali untuk menyalin data dari D2.T1 ke D1.T1, saya mendapatkan kesalahan bahwa sudah ada objek bernama T1 dalam database.

Haruskah saya menjatuhkan meja dan menyalin?

Atau adakah metode yang lebih baik untuk keseluruhan prosedur?

Rizwan
sumber

Jawaban:

6

Untuk menggabungkan jawaban dari @Kin dan @DavidSpillett.

Pertama, asumsi. DB1 dan DB2 berada pada instance yang sama. Memang terdengar seperti itu tetapi tidak ada salahnya untuk menyatakan yang jelas (terutama karena saya telah salah dengan apa yang saya pikir sudah jelas sebelumnya.)

Mengingat bahwa, jika datanya besar, katakan beberapa juta baris kemudian gunakan paket SSIS. Ini memiliki satu fitur spesifik yang ingin Anda gunakan. Anda dapat menentukan ukuran batch. Dengan cara ini ukuran transaksi Anda akan lebih kecil. Kelemahan dari paket SSIS adalah ia menambahkan tingkat kerumitan pada proses Anda. Itu bukan yang besar, tetapi jika Anda bekerja dengan meja yang lebih kecil Anda tidak membutuhkannya.

Yang mengarahkan kita ke opsi lain. Namun jika data dalam kisaran beberapa ratus ribu atau lebih kecil maka gunakan kode seperti ini.

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

Dan yang terakhir tetapi tidak kalah pentingnya adalah jika ada di suatu tempat di asrama maka saya akan mencoba keduanya dan melihat apa yang terbaik untuk Anda.

CATATAN: Anda mungkin juga mempertimbangkan untuk tidak menggunakan SELECT *pada INSERT INTOdan alih-alih menentukan daftar bidang.

Struktur itu akan terlihat seperti ini

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;
Kenneth Fisher
sumber
Terimakasih atas infonya. Ya, tabel hanya memiliki 7800 baris sehingga cukup kecil dan pada contoh yang sama. Saya telah mencoba menggunakan INSERT INTO (tanpa pilih) dan bekerja dengan sempurna. Terima kasih berbagi ini. Saya juga telah menguji dengan Impor Data dengan SSMS. Itu juga berhasil.
Rizwan
1
Perlu diketahui bahwa Anda perlu menentukan daftar bidang (dan tidak menggunakan *) jika ada bidang indentitas dalam tabel - nilai-nilai itu tidak bisa begitu saja "disalin."
Conrad
6

IIRC dengan SELECT <stuff> INTO <target> FROM ...sintaks SQL Server selalu mengasumsikan Anda ingin membuat tabel tujuan dari awal. Saat tabel sudah ada coba INSERT <target> SELECT <stuff> FROM ...sebagai gantinya.

David Spillett
sumber
5
Selain itu, jawaban David juga rute yang lebih baik daripada DROP dan SELECT INTO saat memindahkan data kembali ke D1, karena jika Anda menjatuhkan tabel D1, Anda akan kehilangan objek anak apa pun (mis. Kunci asing, kunci primer, pemicu, dll. )
Delux
2
Saya setuju dengan @Delux. Hal penting lain yang Anda akan kehilangan adalah izin eksplisit. Jika pengguna memiliki izin khusus untuk tabel itu (daripada mengatakan db_datareader) maka jika Anda menjatuhkan tabel maka Anda kehilangan izin tersebut.
Kenneth Fisher
Itu tip yang bagus. Saya tidak mengerti konsekuensi dari DROP sampai sekarang. Terima kasih!
Rizwan
6

Yang terbaik adalah menggunakan SSIS (data Impor / ekspor) untuk melakukan ini. Ini memiliki fungsi untuk hanya mentransfer tabel yang dipilih dari sumber ke tujuan. Secara opsional, Anda bahkan dapat menyimpan paket sehingga dapat digunakan kembali untuk transfer di masa mendatang / berulang.

EDIT: Menambahkan lebih banyak tangkapan layar untuk kejelasan.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Kin Shah
sumber
wow .. terima kasih untuk tangkapan layar yang luar biasa .. mereka sangat membantu
Rizwan
Solusi hebat, tangkapan layar yang bagus berfungsi!
Mayer Spitzer