คัดลอกตารางจากฐานข้อมูลหนึ่งไปยังอีกใน SQL Server


324

ฉันมีฐานข้อมูลชื่อ foo และฐานข้อมูลชื่อ bar ฉันมีตารางใน foo ชื่อ tblFoobar ที่ฉันต้องการย้าย (data และทั้งหมด) ไปยังแถบฐานข้อมูลจากฐานข้อมูล foo คำสั่ง SQL ที่จะทำคืออะไร?

คำตอบ:


208

บน SQL Server และบนเซิร์ฟเวอร์ฐานข้อมูลเดียวกัน ใช้การตั้งชื่อสามส่วน

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

นี่แค่ย้ายข้อมูล หากคุณต้องการย้ายคำจำกัดความของตาราง (และคุณลักษณะอื่น ๆ เช่นการอนุญาตและดัชนี) คุณจะต้องทำอย่างอื่น


คุณจะต้องตั้งค่าการอนุญาตตารางแยกต่างหากฉันเชื่อว่า
Ken Ray

1
หากคุณต้องการแทรกตัวตนเช่นกันตัวช่วยสร้างการนำเข้าข้อมูลมีตัวเลือกสำหรับสิ่งนั้น ^^ - อ้างอิงถึงคำตอบอื่น ๆ
คลาเรนซ์หลิว

13
@TahaRehmanSiddiqui: เพราะมันตอบคำถาม;) เขาไม่ได้ถามวิธีการคัดลอกระหว่างเซิร์ฟเวอร์ฐานข้อมูล แต่คนส่วนใหญ่ที่มองหาคำตอบนั้นจบลงที่นี่เพราะ google ให้ผลลัพธ์แรก :) :)
Maarten Kieft

1
@ RyanB ใช่ที่ได้รับอนุญาต
Amy B

1
@Tom OP และหลาย ๆ คนที่มาที่คำถามนี้กำลังมองหา "คำสั่ง SQL" ไม่ใช่เครื่องมือ
Amy B

535

งาน "นำเข้าข้อมูล" ของ SQL Server Management Studio (คลิกขวาที่ชื่อฐานข้อมูลจากนั้นงาน) จะทำสิ่งนี้ให้คุณมากที่สุด เรียกใช้จากฐานข้อมูลที่คุณต้องการคัดลอกข้อมูล

หากตารางไม่มีอยู่มันจะสร้างตารางให้คุณ แต่คุณอาจต้องสร้างดัชนีและสิ่งนั้นใหม่ หากตารางมีอยู่จริงจะมีการผนวกข้อมูลใหม่ตามค่าเริ่มต้น แต่คุณสามารถปรับ (แก้ไขการแมป) เพื่อที่จะลบข้อมูลที่มีอยู่ทั้งหมด

ฉันใช้มันตลอดเวลาและใช้งานได้ดี


1
ฉันไม่พบตัวเลือกนี้ มีบางอย่างเฉพาะรุ่นที่นี่
Nerrve

35
คุณไม่สามารถพูดได้ว่ามันเป็นคำตอบที่ดีกว่า ไม่สามารถใช้การเรียกอัตโนมัติจากภายในสคริปต์ได้ BTW ผู้เขียนขอเฉพาะสำหรับคำสั่ง "..SQL .. .. " แต่แน่นอนว่ามันเป็นคำตอบที่ดี แต่ไม่ใช่คำตอบที่ดีกว่า;)
Grizzly

3
ผู้เขียนขอให้ย้าย "(ข้อมูลและทั้งหมด)"; ดังนั้นฉันหวังว่าคำตอบนี้จะทำเช่นนั้น มันสร้างตาราง แต่ไม่ได้สร้างคีย์หรือดัชนีใด ๆ ดังนั้นการปรับปรุงคำตอบ SQL ไม่มากนัก
unubar

เป็นไปได้หรือไม่ที่จะระบุWHEREเงื่อนไขโดยใช้งาน Import Data? ฉันไม่สามารถหาวิธีที่จะทำ
บดขยี้

1
ใช่นี่เป็นวิธีที่ถูกต้องตามที่กล่าวไว้ที่นี่เช่นกัน แต่identityและforeign keyการอ้างอิงจะถูกลบออกในฐานข้อมูลปลายทางด้วยวิธีใด?
shaijut

106

สิ่งนี้น่าจะใช้ได้:

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

มันจะไม่คัดลอกค่าคงที่ค่าเริ่มต้นหรือดัชนี ตารางที่สร้างขึ้นจะไม่มีดัชนีแบบคลัสเตอร์

หรือคุณสามารถ:

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

หากตารางปลายทางของคุณมีอยู่และว่างเปล่า


มีปัญหาหรือไม่หากคุณคัดลอกโครงสร้างตารางพื้นฐาน (เขตข้อมูลและข้อมูล) จากนั้นใช้สคริปต์ตัวแก้ไขเพื่อสร้างการอนุญาตดัชนีข้อ จำกัด และคุณสมบัติเพิ่มเติมหรือไม่
lebath

4
สิ่งนี้จะไม่แทรกค่าสำหรับคอลัมน์ข้อมูลประจำตัวใน SQL Server 2008 ซึ่งจะได้รับอนุญาตเฉพาะเมื่อคุณใช้รายการคอลัมน์และ IDENTITY_INSERT เปิดอยู่สำหรับตารางปลายทาง
Lucas Wilson-Richter

@Lucas - คุณ "ครึ่ง" ถูกต้อง :) อย่างไรก็ตามคำสั่ง SQL แรกจะคัดลอกข้อมูลทั้งหมดรวมถึงค่าภายในคอลัมน์ข้อมูลประจำตัว อย่างที่ฉันพูดข้อ จำกัด ไม่ได้ถูกสร้างขึ้น แต่สามารถสคริปต์ได้อย่างง่ายดายบนฐานข้อมูลต้นทางและนำไปใช้กับฐานข้อมูลปลายทางเมื่อข้อมูลทั้งหมดถูกย้าย
lebath

รุ่นที่สอง ( INSERT INTO...) ทำงานให้ฉันใน Oracle
vapcguy

ใช้งานได้หรือไม่หากฐานข้อมูล 2 อยู่บนเซิร์ฟเวอร์ที่แตกต่างกันโดยสิ้นเชิงกับสตริงการเชื่อมต่อที่แตกต่างกัน? ถ้าไม่ใช่คุณจะจัดการกับสิ่งนั้นได้อย่างไร
Alexander Ryan Baggett

46

หากเป็นเพียงตารางเดียวสิ่งที่คุณต้องทำคือ

  • คำจำกัดความของตารางสคริปต์
  • สร้างตารางใหม่ในฐานข้อมูลอื่น
  • อัปเดตกฎดัชนีสิทธิ์และอื่น ๆ
  • นำเข้าข้อมูล (มีการแทรกลงในตัวอย่างหลายรายการแล้วด้านบน)

สิ่งหนึ่งที่คุณต้องพิจารณาคือการอัปเดตอื่น ๆ เช่นการย้ายวัตถุอื่น ๆ ในอนาคต โปรดทราบว่าตารางต้นทางและตารางปลายทางของคุณไม่มีชื่อเดียวกัน ซึ่งหมายความว่าคุณจะต้องทำการเปลี่ยนแปลงหากคุณขึ้นอยู่กับวัตถุเช่นมุมมองขั้นตอนการจัดเก็บและอื่น ๆ

เล็กน้อยหนึ่งหรือหลายวัตถุที่คุณสามารถไปด้วยตนเองโดยไม่มีปัญหาใด ๆ อย่างไรก็ตามเมื่อมีมากกว่าเพียงไม่กี่ปรับปรุงเครื่องมือเปรียบเทียบของบุคคลที่สามมามีประโยชน์มาก ตอนนี้ฉันใช้ApexSQL Diffสำหรับการโยกย้ายสคีมา แต่คุณไม่สามารถผิดพลาดกับเครื่องมืออื่น ๆ


23
  1. สคริปต์ the create tablein studio studio เรียกใช้สคริปต์นั้นในแถบเพื่อสร้างตาราง (คลิกขวาที่ตารางใน Object explorer, ตารางสคริปต์เป็น, สร้างเป็น ... )

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


1
ฉันชอบวิธีนี้ เลือก * จะไม่ทำงานหากมีคอลัมน์ข้อมูลระบุตัวตนคุณจะต้องระบุชื่อคอลัมน์อย่างชัดเจน คุณจะต้องทำSET IDENTITY_INSERT TblName ONในกรณีนั้นด้วย
JeremyWeir

16

คุณยังสามารถใช้วิซาร์ดสร้างสคริปต์เซิร์ฟเวอร์ SQLเพื่อช่วยแนะนำการสร้างสคริปต์ SQL ที่สามารถทำสิ่งต่อไปนี้:

  • คัดลอกตารางสคีมา
  • ข้อ จำกัด ใด ๆ (ข้อมูลเฉพาะค่าเริ่มต้น ฯลฯ )
  • ข้อมูลภายในตาราง
  • และตัวเลือกอื่น ๆ ถ้าจำเป็น

เวิร์กโฟลว์ตัวอย่างที่ดีสำหรับSQL Server 2008มีภาพหน้าจอที่แสดงที่นี่


ดูความคิดเห็นของฉันข้างต้น:?!? "วิธีนี้ไม่ได้รับ 508/171 โหวตและไรอัน '11 ตุลาคม '11 ที่ 23:41' คำตอบจะได้รับ 13 วันที่ไรอันเป็นเพียงคำตอบคำตอบที่คิวสหกรณ์. สมบูรณ์ . เพราะมัน จัดการกับสถานการณ์เหล่านี้ (ซึ่ง btw, OP ไม่ได้แยกออกจาก q ของเขา): a) ข้อมูลประจำตัว ( ทั่วไปมาก ), b) ข้อ จำกัด , c) ทริกเกอร์, d) ดัชนี, e) สิทธิ์, d) การคัดลอก Schema และข้อมูล คำแนะนำ: ส่วน "และทั้งหมด" ของ op's "(data and all)" หมายถึง Schema ด้วย) และ e) สร้าง "คำสั่ง SQL" ซึ่ง op ระบุไว้ซึ่งแม้ว่าเขาไม่ได้หมายความว่ามันจะดีกว่า กว่าไม่ "
Tom

1
หมายเหตุ: คำตอบนี้ใช้ได้เฉพาะเมื่อ # ของแถวไม่ "มากเกินไป" (เช่นตารางการค้นหา / ธุรกรรมขนาดเล็ก) และไม่มีค่าคอลัมน์ "ใหญ่" สำหรับสิ่งเหล่านั้นฉันจะใช้คำตอบของไรอันเพียงเพื่อสร้างสคริปต์สำหรับตาราง (รวมถึงคอลัมน์คุณสมบัติและวัตถุย่อย) การสร้างจากนั้นใช้คำตอบ "แทรกลงในการเลือก" ของ David B สำหรับตารางเดียว (แทนของ Ryan's A) คุณยังสามารถใช้ SSMS, Object Explorer, ตารางคลิกขวา, ตารางสคริปต์เป็น, สร้างเป็น, แต่คุณต้องทำอันดับแรกให้แน่ใจว่าเครื่องมือ, ตัวเลือก, SQL Server Object Explorer, ตัวเลือกการเขียนสคริปต์ ตั้งค่าตามต้องการ
Tom

9

คุณอาจไปทางนี้: (ตัวอย่างทั่วไป)

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

นอกจากนี้หากคุณต้องการสร้างชื่อคอลัมน์เช่นกันเพื่อใส่ส่วนคำสั่งแทรกให้ใช้:

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

คัดลอกผลลัพธ์และวางลงในหน้าต่างแบบสอบถามเพื่อแสดงชื่อคอลัมน์ตารางของคุณและสิ่งนี้จะแยกคอลัมน์ข้อมูลประจำตัวด้วย:

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

โปรดจำไว้ว่าสคริปต์เพื่อคัดลอกแถวจะทำงานหากฐานข้อมูลอยู่ในตำแหน่งเดียวกัน


คุณสามารถลองสิ่งนี้

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

ชื่อเซิร์ฟเวอร์เป็นทางเลือกถ้าฐานข้อมูลทั้งสองอยู่ในเซิร์ฟเวอร์เดียวกัน


1

หากมีตารางที่มีอยู่และเราต้องการคัดลอกข้อมูลเท่านั้นเราสามารถลองใช้แบบสอบถามนี้

แทรกลงใน Destination_Existing_Tbl เลือก col1, col2 จาก Source_Tbl


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.