SQL Server'da tabloları bir veritabanından diğerine kopyalama


325

Foo adlı bir veritabanım ve bar adlı bir veritabanım var. Foo içinde tblFoobar (veri ve tüm) veritabanı foo veritabanı çubuğuna taşımak istediğiniz adlı bir tablo var. Bunu yapmak için SQL deyimi nedir?

Yanıtlar:


208

SQL Server'da mı? ve aynı veritabanı sunucusunda? Üç parça adlandırma kullanın.

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

Bu sadece verileri taşır. Tablo tanımını (ve izinler ve dizinler gibi diğer özellikler) taşımak istiyorsanız, başka bir şey yapmanız gerekir.


Ayrıca, tablo izinlerini ayrı ayrı ayarlamanız gerekeceğini düşünüyorum.
Ken Ray

1
Kimlik ekleri de yapmanız gerekiyorsa, Veri Alma Sihirbazı bunun için bir seçeneğe sahiptir ^^ - diğer cevaba atıfta bulunarak
Clarence Liu

13
@TahaRehmanSiddiqui: Çünkü soruyu cevaplıyor;) Veritabanı sunucuları arasında nasıl kopyalayacağını sormadı. Ancak bu cevabı arayan çoğu insan burada sona erer, çünkü google ilk sonucu verir :)
Maarten Kieft

1
@RyanB evet, buna izin verilir.
Amy B

1
@Tom OP ve bu soruya gelen birçok kişi bir araç değil, bir "SQL deyimi" arıyor.
Amy B

535

SQL Server Management Studio'nun "Verileri İçe Aktar" görevi (DB adına sağ tıkladıktan sonra görevler) bunun çoğunu sizin için yapar. Verileri kopyalamak istediğiniz veritabanından çalıştırın.

Tablolar yoksa, bunları sizin için oluşturacaktır, ancak muhtemelen herhangi bir dizin ve benzeri yeniden oluşturmanız gerekecektir. Tablolar varsa, varsayılan olarak yeni verileri ekler, ancak bunu (eşlemeleri düzenle) mevcut tüm verileri silmesi için ayarlayabilirsiniz.

Bunu her zaman kullanıyorum ve oldukça iyi çalışıyor.


1
Bu seçeneği bulamıyorum. burada belirli bir sürüm var mı?
Nerrve

35
Genel olarak daha iyi bir cevap olduğunu söyleyemezsiniz. Örneğin, otomasyonun bir komut dosyasından çağrılması kullanılamaz. BTW yazar özellikle "..SQL deyimi .." istedi. Ama elbette bu harika bir cevap, ama daha iyi bir cevap değil;).
grizzly

3
Yazar "(veriler ve hepsi)" taşınmasını istedi; bu yüzden bu cevabın bunu yapmasını umdum. Tablo oluşturur, ancak herhangi bir anahtar veya dizin oluşturmaz; bu yüzden SQL yanıtı üzerinde bir gelişme değil.
unubar

WHEREVerileri İçe Aktar görevini kullanarak bir koşul belirtmek mümkün mü ? Bunu yapmanın bir yolunu bulamadım.
ezmek

1
evet bu da burada belirtildiği gibi doğru yol , identityve foreign keyreferanslar hedef veritabanında kaldırılır, herhangi bir çözüm?
shaijut

106

Bu çalışmalı:

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

Bu olacak değil constaints, varsayılan ya da dizinleri kopyalamak. Oluşturulan tablo olacak değil bir kümelenmiş bir dizin var.

Alternatif olarak şunları yapabilirsiniz:

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

Hedef tablonuz varsa ve boşsa.


Temel tablo yapısını (alanlar ve veriler) önce kopyalayıp sonra izinler, dizinler, kısıtlamalar ve genişletilmiş özellikler oluşturmak için bir yama komut dosyası uygularsanız herhangi bir sorun var mı ?
leoinfo

4
Bu, SQL Server 2008'de kimlik sütunları için değer eklemez. Buna yalnızca bir sütun listesi kullandığınızda ve hedef tablo için IDENTITY_INSERT AÇIK olduğunda izin verilir.
Lucas Wilson-Richter

@Lucas - "Yarı" haklısın :). Ancak, ilk SQL deyimi kimlik sütunlarındaki değerler de dahil olmak üzere TÜM verileri kopyalar. Dediğim gibi, kısıtlamalar yaratılmadı. Ancak, kaynak DB'de kolayca komut dosyası oluşturulabilir ve tüm veriler taşındıktan sonra hedef DB'ye uygulanabilir.
leoinfo

İkinci sürüm ( INSERT INTO...) benim için Oracle'da çalıştı.
vapcguy

Bu, 2 veritabanı farklı bağlantı dizelerine sahip tamamen farklı sunucularda çalışıyorsa çalışır mı? Değilse, bu nasıl halledilir?
Alexander Ryan Baggett

46

Sadece bir masa varsa, tek yapmanız gereken

  • Kod tablosu tanımı
  • Başka bir veritabanında yeni tablo oluşturma
  • Güncelleme kuralları, dizinler, izinler vb.
  • Verileri içe aktarma (örneklere birkaç ekleme zaten yukarıda gösterilmiştir)

Dikkate almanız gereken bir şey, gelecekte diğer nesneleri taşıma gibi diğer güncellemelerdir. Kaynak ve hedef tablolarınızın aynı ada sahip olmadığını unutmayın. Bu, görünümler, saklı yordamlar ve diğer nesneler gibi bağımlı nesnelere de değişiklik yapmanız gerekeceği anlamına gelir.

Herhangi bir sorun olmadan manuel olarak gidebileceğiniz bir veya birkaç nesne. Ancak, sadece birkaç güncellemeden daha fazlası olduğunda 3. taraf karşılaştırma araçları çok kullanışlı olur. Şu anda şema geçişleri için ApexSQL Diff kullanıyorum, ancak başka bir araçla yanlış gidemezsiniz.


23
  1. Senaryo create tableyönetim stüdyoda, tablo oluşturmak için çubuğunda o komut dosyasını çalıştırın. (Nesne gezgininde sağ tıklama tablosu, komut dosyası tablosu olarak, oluştur ...)

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


1
Bu yaklaşımı seviyorum. Bir kimlik sütunu varsa * seçeneği çalışmazsa, sütun adlarını açıkça listelemeniz gerekir. Bu SET IDENTITY_INSERT TblName ONdurumda da yapmanız gerekecek .
JeremyWeir

16

Aşağıdakileri yapabilen SQL komut dosyalarının oluşturulmasına rehberlik etmek için SQL Server Komut Dosyaları Oluşturma Sihirbazı'nı da kullanabilirsiniz :

  • tablo şemasını kopyala
  • herhangi bir kısıtlama (kimlik, varsayılan değerler vb.)
  • tablo içindeki veriler
  • ve gerekirse diğer birçok seçenek

Burada gösterilen ekran görüntüleri ile SQL Server 2008 için iyi örnek iş akışı .


Yukarıdaki açıklamalarım bakınız:?!? "Bu nasıl 508/171 Oy almak ve Ryan vermedi '11 Ekim '11 23:41 de' Cevap sadece bugüne kadar 13 olsun Ryan ise sadece cevap . Cevabın op en q var tamamen . Çünkü o bu senaryoları (btw, OP q'dan hariç tutmadı) işler: a) Kimlik ( çok yaygın), b) Kısıtlamalar, c) Tetikleyiciler, d) Dizinler, e) İzinler, d) Şema VE Verileri kopyalama ( İpucu: op'ların "ve tüm" kısmı "(veriler ve hepsi)" Schema'yı da ima eder.) Ve e) op'un belirttiği "SQL deyimi" oluşturur. o zaman olmaz.".
Tom

1
Not: Bu Yanıt yalnızca Satır # sayısı "aşırı" (arama / küçük işlem Tabloları) olmadığında ve "büyük" Sütun değerleri olmadığında pratiktir. Bunlar için, Ryan'ın Yanıtını yalnızca Tablo (Sütun Öznitelikleri ve alt Nesneler dahil) Oluşturma için Komut Dosyası oluşturmak ve sonra David B'nin "Seçime Ekle" Yanıtı'nı kullanmak için kullanırım. Tekli Tablolar için (Ryan'ın A yerine), SSMS, Nesne Gezgini, Sağ Tıklama Tablosu, Komut Dosyası Tablosu, OLUŞTUR olarak da kullanabilirsiniz, ancak Araçlar, Seçenekler, SQL Server Nesne Gezgini, Komut Dosyası seçeneklerinin istediğiniz gibi ayarlayın.
Tom

9

Şu şekilde gidebilirsiniz: (genel bir örnek)

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

Ayrıca insert yan tümcesini koymak için sütun adlarını da oluşturmanız gerekiyorsa, şunu kullanın:

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

Sonucu kopyalayın ve tablo sütun adlarınızı temsil edecek şekilde sorgu penceresine yapıştırın; bu bile kimlik sütununu da hariç tutacaktır:

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

Veritabanlarının aynı konuma ait olması durumunda, satırları kopyalayacak komut dosyasının çalışacağını unutmayın.


Bunu deneyebilirsiniz.

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

Her iki DB de aynı sunucudaysa, sunucu adı isteğe bağlıdır.


1

Mevcut bir tablo varsa ve yalnızca verileri kopyalamak istiyorsak, bu sorguyu deneyebiliriz.

Destination_Existing_Tbl hedefine ekle col1, col2 FROM Source_Tbl


0

Verileri Kopyala

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.