SQL Server - Bir veritabanı tablosunun bir kopyasını oluşturup aynı veritabanına mı yerleştir?


108

Bir veritabanı DB'sinde bir ABC tablosu var. Aynı DB'de ABC_1, ABC_2, ABC_3 adlarıyla ABC kopyaları oluşturmak istiyorum. Bunu Management Studio (tercihen) veya SQL sorgularını kullanarak nasıl yapabilirim?

Bu, SQL Server 2008 R2 içindir.


1
başka bir gönderi doğrudan ilişkili değildir, ancak yukarıdaki kullanım durumu ile ilgili olabilir - stackoverflow.com/questions/6810425/… bu, tablonun kopyalarını düzenlemek istediğinizde yararlı olabilir (örn. boş değerlere izin verme, veri türünü değiştirme vb. .) kopyaları yeniden oluşturmak zorunda kalmadan.
netice.learner

Yanıtlar:


212

Kullanım SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Bu ABC_1, aynı sütun yapısına sahip ABCve aynı verileri içeren yeni bir tablo oluşturacaktır . Ancak kısıtlamalar (örneğin anahtarlar, varsayılan değerler) kopyalanmaz.

Bu sorguyu her seferinde farklı bir tablo adıyla birden çok kez çalıştırabilirsiniz.


Verileri kopyalamanız gerekmiyorsa, yalnızca aynı sütun yapısına sahip yeni bir boş tablo oluşturmak WHEREiçin sahte ifadeli bir cümle ekleyin :

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;

3
Sorunum için mükemmel cevap.
netice.learner

8
Tam olarak çalışmaz .... orijinaldeki hesaplanan sütunlar hedefte aynı şekilde kopyalanmaz. Ayrıca, PK ve Varsayılan kısıtlamalar da kopyalanmaz
Simon Green

@SimonGreen - Kodunuzla bu sorun için yeni bir soru gönderebilirsiniz.
Mahmud Gamal

3
Tabii ki tam olarak çalışmıyor. Kısıtlamaların kopyalanmaması, birincil anahtarların veya varsayılan değerlerin kopyalanmaması konusunda uyarıda bulundu. Verdiği komut, aynı sütun yapısına sahip (aynen söylediği gibi) yeni bir tablo oluşturur ve tüm verileri sizin için yeni tabloya ekler.
user5855178

1
Her SELECT TOP(0) *zaman yanlış WHEREifade yönteminden daha temiz buluyorum
Thymine

21

SSMS UI aracılığıyla Şemayı Kopyala (DDL Oluştur)

SSMS'de veritabanınızı Object Explorer'da genişletin, Tablolar'a gidin , ilgilendiğiniz tabloya sağ tıklayın ve Script Table As , Create To , New Query Editor Window'u seçin . Bir bulurum ve (replace CTRL + H (koymak yani tablo adını değiştirmek için) ABCiçinde hangi Bul alan ve ABC_1içinde Konan ardından OK ).

Şemayı T-SQL ile Kopyala

Bunun SQL ile nasıl yapılacağını gösteren diğer cevaplar da işe yarıyor, ancak bu yöntemdeki fark, aynı zamanda herhangi bir indeks, kısıtlama ve tetikleyici de alacaksınız.

Verileri Kopyala

Verileri dahil etmek istiyorsanız, bu tabloyu oluşturduktan sonra tüm verileri ABC'den kopyalamak için aşağıdaki kodu çalıştırın (bir kimlik alanınız varsa aynı kimlik değerlerini koruyun):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off

1
Bu yöntemin indeksleri de kopyaladığından emin misiniz? Ben denedim ama olmadı.
BornToCode

3
Sen ayarlamalısınız IDENTITY_INSERTiçin ON izni "elle" kimlik sütunu ayarlayın, size örnekte sipariş karışık için. Ayrıca, sütunlarınızı AÇIKLAYINIZ
jean

2
Teşekkürler @jean; 6 yıl sonra fark edilmeden iyi görüldü! Sabit.
JohnLBevan

Bu benim için neredeyse sorunu çözdü. Son numara, SSMS'deki ağaçtaki "Sütunlar" klasörünü düzenleyiciye sürükleyerek sütunların bir listesini elde edebilmenizdir. Her tabloda bir zaman damgası sütunum var, bu nedenle sütunların listesini almam ve ardından zaman damgasını kaldırmam gerekiyordu.
Wade Hatler

10

Tabloyu tüm kısıtlamaları ve anahtarlarıyla çoğaltmak istiyorsanız, aşağıdaki adımları izleyin:

  1. Veritabanını SQL Management Studio'da açın.
  2. Çoğaltmak istediğiniz tabloya sağ tıklayın.
  3. Komut Dosyası Tablosu'nu seçin -> Oluştur -> Yeni Sorgu Düzenleyici Penceresi. Bu, tabloyu yeni bir sorgu penceresinde yeniden oluşturmak için bir komut dosyası oluşturacaktır.
  4. Koddaki tablo adını ve ilgili anahtarları ve kısıtlamaları değiştirin.
  5. Komut dosyasını çalıştırın.

Ardından verileri kopyalamak için aşağıdaki komut dosyasını çalıştırın:

SET IDENTITY_INSERT DuplicateTable ON

INSERT Into DuplicateTable ([Column1], [Column2], [Column3], [Column4],... ) 
SELECT [Column1], [Column2], [Column3], [Column4],... FROM MainTable

SET IDENTITY_INSERT DuplicateTable OFF

4

1. seçenek

select *
  into ABC_1
  from ABC;

2. seçenek: SSIS kullanın, yani nesne gezginde veritabanına sağ tıklayın> tüm görevler> verileri dışa aktar

  • kaynak ve hedef: DB'niz
  • kaynak tablo: ABC
  • hedef tablo: ABC_1 (tablo oluşturulacak)

2

Bu başka bir seçenektir:

select top 0 * into <new_table> from <original_table>

2
Bu istek, tabloyu veri olmadan kopyalar. Kullanıcı tabloları kopyalamayı istedi.
Alekzander

1

sql server manegement studio veya netcat kullanın ve bu sql'yi işlemek daha kolay olacaktır


1

Tabloyu ve verilerini, kısıtlamalarını ve tetikleyicilerini kopyalamak için SSIS yazmanız gerekir. Kuruluşumuzda kalrom Systems tarafından Kal Admin adında ücretsiz indirilebilen bir yazılım bulunmaktadır (Tabloları kopyala özelliğinin isteğe bağlı olduğunu düşünüyorum)

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.