Salin tabel dari satu database ke yang lain di SQL Server

325

Saya memiliki basis data yang disebut foo dan basis data yang disebut bar. Saya punya tabel di foo bernama tblFoobar yang ingin saya pindahkan (data dan semua) ke bilah basis data dari basis data foo. Apa pernyataan SQL untuk melakukan ini?

RyanKeeter
sumber

Jawaban:

208

Di SQL Server? dan pada server database yang sama? Gunakan penamaan tiga bagian.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

Ini hanya memindahkan data. Jika Anda ingin memindahkan definisi tabel (dan atribut lainnya seperti izin dan indeks), Anda harus melakukan sesuatu yang lain.

Amy B
sumber
Anda juga harus mengatur izin meja secara terpisah, saya percaya.
Ken Ray
1
Jika Anda perlu melakukan sisipan identitas juga, Wisaya Impor Data memiliki opsi untuk itu ^^ - merujuk pada jawaban lain
Clarence Liu
13
@TahaRehmanSiddiqui: Karena menjawab pertanyaan;) Dia tidak bertanya bagaimana cara menyalinnya di antara server database. Tetapi kebanyakan orang mencari jawaban itu berakhir di sini, karena google memberikannya sebagai hasil pertama :)
Maarten Kieft
1
@RyanB ya, itu diizinkan.
Amy B
1
@ Tom OP dan banyak orang yang datang ke pertanyaan ini mencari "pernyataan SQL", bukan alat.
Amy B
535

Tugas "Impor Data" SQL Server Management Studio (klik kanan pada nama DB, lalu tugas) akan melakukan sebagian besar untuk Anda. Jalankan dari basis data yang ingin Anda salin.

Jika tabel tidak ada, itu akan membuatnya untuk Anda, tetapi Anda mungkin harus membuat ulang indeks apa pun dan semacamnya. Jika tabel memang ada, itu akan menambahkan data baru secara default tetapi Anda dapat menyesuaikan itu (edit pemetaan) sehingga akan menghapus semua data yang ada.

Saya menggunakan ini sepanjang waktu dan bekerja dengan cukup baik.

David
sumber
1
saya tidak dapat menemukan opsi ini. apakah ada sesuatu yang spesifik di sini?
Nerrve
35
Anda tidak bisa mengatakan itu adalah jawaban yang lebih baik secara umum. Sebagai contoh, otomatisasi tidak dapat dipanggil dari dalam skrip. BTW penulis meminta secara khusus untuk "pernyataan ..SQL ..". Tapi tentu saja itu jawaban yang bagus, tapi bukan yang lebih baik;).
grizzly
3
Penulis diminta untuk memindahkan "(data dan semua)"; jadi saya berharap jawaban ini berhasil. Itu membuat tabel tetapi tidak membuat kunci atau indeks apa pun; jadi tidak banyak perbaikan atas jawaban SQL.
unubar
Apakah mungkin untuk menentukan WHEREkondisi menggunakan tugas Impor Data? Saya tidak dapat menemukan cara untuk melakukannya.
naksir
1
ya ini cara yang benar seperti yang disebutkan di sini juga, tetapi identitydan foreign keyreferensi dihapus di database tujuan, ada solusi?
shaijut
106

Ini seharusnya bekerja:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

Itu tidak akan menyalin batasan, standar atau indeks. Tabel yang dibuat tidak akan memiliki indeks berkerumun.

Atau Anda bisa:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

Jika tabel tujuan Anda ada dan kosong.

leoinfo
sumber
Apakah ada masalah jika Anda pertama kali menyalin struktur tabel dasar (bidang dan data) dan kemudian menerapkan skrip tambalan untuk membuat izin, indeks, kendala, dan properti yang diperluas?
leoinfo
4
Ini tidak akan memasukkan nilai untuk kolom identitas dalam SQL Server 2008. Itu hanya diperbolehkan ketika Anda menggunakan daftar kolom dan IDENTITY_INSERT adalah ON untuk tabel tujuan.
Lucas Wilson-Richter
@Lucas - Anda "setengah" benar :). Namun, pernyataan SQL pertama menyalin SEMUA data, termasuk nilai-nilai di dalam kolom identitas. Seperti yang saya katakan, kendala tidak dibuat. Tetapi mereka dapat dengan mudah ditulis pada sumber DB dan diterapkan ke DB tujuan setelah semua data dipindahkan.
leoinfo
Versi kedua ( INSERT INTO...) bekerja untuk saya di Oracle.
vapcguy
Apakah ini berfungsi jika 2 database berada di server yang sama sekali berbeda dengan string koneksi yang berbeda? Jika tidak, bagaimana Anda mengatasinya?
Alexander Ryan Baggett
46

Jika hanya satu meja maka yang perlu Anda lakukan adalah

  • Definisi tabel skrip
  • Buat tabel baru di database lain
  • Perbarui aturan, indeks, izin, dan semacamnya
  • Impor data (beberapa masukkan ke dalam contoh sudah ditunjukkan di atas)

Satu hal yang harus Anda pertimbangkan adalah pembaruan lain seperti memigrasi objek lain di masa mendatang. Perhatikan bahwa tabel sumber dan tujuan Anda tidak memiliki nama yang sama. Ini berarti Anda juga harus melakukan perubahan jika Anda bergantung pada objek seperti tampilan, prosedur tersimpan, dan lainnya.

Sedikit pun satu atau beberapa objek Anda dapat pergi secara manual tanpa masalah. Namun, ketika ada lebih dari beberapa pembaruan, alat perbandingan pihak ke-3 sangat berguna. Saat ini saya menggunakan ApexSQL Diff untuk migrasi skema tetapi Anda tidak dapat salah dengan alat lain di luar sana.

Igor Voplov
sumber
23
  1. Script create tabledi studio manajemen, jalankan script di bar untuk membuat tabel. (Klik kanan tabel pada objek explorer, skrip table as, create to ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table

ScottStonehouse
sumber
1
Saya suka pendekatan ini. Pilih * tidak akan berfungsi jika ada kolom identitas, Anda harus mencantumkan nama kolom secara eksplisit. Anda juga harus melakukannya SET IDENTITY_INSERT TblName ONdalam kasus itu.
JeremyWeir
16

Anda juga dapat menggunakan Wisaya pembuatan skrip SQL Server untuk membantu memandu pembuatan skrip SQL yang dapat melakukan hal berikut:

  • salin skema tabel
  • kendala apa pun (identitas, nilai default, dll)
  • data dalam tabel
  • dan banyak opsi lain jika diperlukan

Alur kerja contoh yang bagus untuk SQL Server 2008 dengan cuplikan layar ditampilkan di sini .

ryan
sumber
Lihat komentar saya di atas: "Bagaimana ini mendapatkan 508/171 Suara dan Ryan" 11 Okt '11 di 23:41 "Jawaban hanya mendapatkan 13 sampai saat ini?!? Ryan adalah satu - satunya jawaban yang menjawab q op sepenuhnya . Karena itu menangani skenario ini (yang, btw, OP TIDAK mengecualikan dari q-nya.): a) Identitas ( sangat umum), b) Kendala, c) Pemicu, d) Indeks, e) Izin, d) menyalin Skema DAN Data ( Petunjuk: "dan semua" bagian dari op's "(data dan semua)" menyiratkan Skema juga.) Dan e) menghasilkan "pernyataan SQL" yang ditentukan op yang bahkan jika dia tidak berarti secara harfiah lebih baik untuk memiliki daripada tidak. "
Tom
1
Catatan: Jawaban ini hanya praktis bila # Baris tidak "berlebihan" (yaitu Tabel pencarian / transaksi kecil) dan tidak ada nilai kolom "besar". Bagi mereka, saya akan menggunakan Jawaban Ryan hanya untuk menghasilkan Script untuk Tabel (termasuk Atribut Kolom dan sub-Objek) Penciptaan, dan kemudian menggunakan jawaban David B "Insert Into Select". Untuk Tabel tunggal (bukan Ryan's A), Anda juga dapat menggunakan SSMS, Object Explorer, Tabel Klik Kanan, Script Table, CREATE To, tetapi Anda harus memastikan Alat, Opsi, SQL Server Object Explorer, opsi Scripting adalah atur sesuai keinginan.
Tom
9

Anda dapat menggunakan cara ini: (contoh umum)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

Juga jika Anda perlu membuat nama kolom juga untuk memasukkan klausa penyisipan, gunakan:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Salin hasil dan tempel ke jendela permintaan untuk mewakili nama kolom tabel Anda dan bahkan ini akan mengecualikan kolom identitas juga:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

Ingat skrip untuk menyalin baris akan berfungsi jika database milik lokasi yang sama.


Anda bisa Coba Ini.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

Nama server adalah opsional jika kedua DB berada di server yang sama.

Tidak ada yang hilang
sumber
1

Jika ada tabel yang ada dan kami hanya ingin menyalin data, kami dapat mencoba kueri ini.

masukkan ke Destination_Existing_Tbl pilih col1, col2 FROM Source_Tbl

Mohan
sumber
0

Salin Data

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Arun Prasad ES
sumber