Menyalin (ratusan) tabel dari satu server ke yang lain (dengan SSMS)

27

Saya memiliki beberapa ratus (saat ini 466, tetapi terus bertambah) tabel saya harus menyalin dari satu server ke yang lain.

Saya belum pernah melakukan ini sebelumnya, jadi saya tidak yakin sama sekali tentang cara mendekatinya. Semua tabel dalam format yang sama:Cart<Eight character customer number>

Ini adalah bagian dari proyek yang lebih besar di mana saya menggabungkan semua Cart<Number>tabel ini menjadi satu Cartstabel, tapi itu pertanyaan yang sama sekali berbeda.

Adakah yang punya metode praktik terbaik yang bisa saya gunakan untuk menyalin semua tabel ini? Nama-nama database pada kedua server adalah sama, jika itu membantu. Dan seperti yang saya katakan sebelumnya, saya memiliki saakun sehingga saya bisa melakukan apa pun yang diperlukan untuk mendapatkan data dari A ke B. Kedua server berada di server farm yang sama, juga.

410_Gone
sumber
2
Mungkin menarik dba.stackexchange.com/questions/30473/…
billinkc

Jawaban:

21

Anda bisa menggunakan tugas "Ekspor Data" SQL Server Management Studio. Klik kanan pada database di SSMS, pilih Tugas dan kemudian "Ekspor Data". Ini akan meluncurkan panduan interaktif yang akan memungkinkan untuk menyalin tabel dari satu server ke yang lain, meskipun Anda harus membuat ulang indeks sendiri. Wisaya membuat paket SSIS sementara (meskipun Anda juga dapat memilih untuk menyimpannya) dan relatif cepat.

Alex
sumber
4
Dapat juga melakukan tugas Ekspor yang sama melalui PowerShell jika tertarik. Skrip serupa untuk melakukan tindakan ini ada dalam jawaban saya di sini: dba.stackexchange.com/a/122149/507
Shawn Melton
mengapa impor / ekspor tidak menyalin indeks dan dependensi? bukankah terlalu sulit untuk membuat ulang indeks untuk 466 tabel?
Vini
@Vini Anda juga dapat menggunakan wizard Generate Scripts, yang memungkinkan Anda untuk menyalin indeks (saya tidak tahu apakah itu dapat menghasilkan skrip dengan urutan ketergantungan yang benar, meskipun - Saya selalu menggunakan RedGate SQL Compare untuk itu).
Aaron Bertrand
@ AaronBertrand: Oke. Saya juga punya pertanyaan yang sama. Tetapi ketika saya mengimpor datetime juga dikonversi ke smalldatetime
Vini
23

Berikut ini adalah pendekatan cepat & kotor yang hanya membutuhkan server yang ditautkan, di setiap arah, dengan hak istimewa yang memadai, kompatibilitas susunan, dan akses data yang diaktifkan. Anda menjalankan ini pada server sumber tertaut untuk menghasilkan SQL dinamis yang akan dieksekusi pada server tertaut tujuan.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * INTO [database].dbo.' + QUOTENAME(name)
  + N' FROM [source_linked_server].[database].dbo.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE name LIKE N'Cart[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

PRINT @sql; -- this will only print 8K, enough to spot check
--EXEC [destination_linked_server].master.sys.sp_executesql @sql;
Aaron Bertrand
sumber
19

Jika Anda ingin sesuatu yang dapat ditulis ulang dengan mudah dijalankan kembali saat Anda menguji ini dan membuat perubahan kecil, lihat jawaban saya di sini:

Impor data dari satu Database ke skrip lain

Jawaban itu menjelaskan menggunakan prosedur tersimpan SQLCLR yang menggunakan SqlBulkCopykelas di .NET. Menggunakan prosedur yang tersimpan itu dapat dilakukan dalam kursor yang loop melalui tabel. Ini memungkinkan pengeditan proses yang mudah serta memperhitungkan tabel baru, atau dengan mudah mengecualikan satu atau lebih tabel melalui suatu WHEREkondisi dalam permintaan kursor.

Solomon Rutzky
sumber