วิธีคัดลอกแถวจากตาราง SQL Server หนึ่งไปยังอีกตาราง


93

ฉันมีตารางที่เหมือนกันสองตารางและต้องการคัดลอกแถวจากตารางไปยังอีกตารางหนึ่ง วิธีที่ดีที่สุดคืออะไร? (ฉันต้องการคัดลอกโดยใช้โปรแกรมเพียงไม่กี่แถวฉันไม่จำเป็นต้องใช้ยูทิลิตี้สำเนาจำนวนมาก)

คำตอบ:


120

ตราบเท่าที่ไม่มีคอลัมน์ประจำตัวคุณสามารถทำได้

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]

23
โปรดใช้ความระมัดระวังกับไวยากรณ์นี้เนื่องจากจะไม่ทำงานหาก Table2 มีคอลัมน์ข้อมูลประจำตัวและจะหยุดทำงานในอนาคตหาก Table1 เปลี่ยนแปลงโดยที่ Table2 ไม่เปลี่ยนแปลงในการซิงค์ (เผาฉันก่อน) โซลูชันนี้อาจเหมาะสำหรับกรณีของคุณเพียงแค่คำนึงถึงข้อควรพิจารณาเหล่านี้
Michael Haren

11
คุณสามารถใช้SET IDENTITY_INSERT < table > ON(และSET IDENTITY_INSERT < table > OFF) เพื่อปิดใช้งานคอลัมน์ข้อมูลประจำตัวชั่วคราวบนตารางที่คุณพยายามแทรกเข้าไป ทำงานให้ฉันพยายามกู้คืนระเบียนที่ขาดหายไปสองสามรายการในช่วงกลางของชุดข้อมูล
nickb

1
จะเกิดอะไรขึ้นถ้าคีย์หลักใน table1 มีอยู่ใน table2 เป็นคีย์ต่างประเทศ ฉันมีสิ่งเดียวกันและฉันไม่รู้ว่าจะทำอย่างไร .. ใน table2 id คือคีย์ต่างประเทศ AS "Technology_idTechnology" และในตารางที่ 1 จะเป็น "idTechnology" ฉันต้องการคัดลอกรายการทั้งหมดจาก table1 ถึง table2 เมื่อ idTechnology ตรงกันทั้งสองตาราง ..
ZelelB

71

ไวยากรณ์ทางเลือก:

INSERT tbl (Col1, Col2, ..., ColN)
  SELECT Col1, Col2, ..., ColN
  FROM Tbl2
  WHERE ...

แบบสอบถามแบบเลือกสามารถ (แน่นอน) รวมถึงนิพจน์ประโยคกรณีค่าคงที่ / ตัวอักษร ฯลฯ


2
วิธีนี้ดีมากเมื่อตารางแตกต่างกันเล็กน้อย ฉันมีคอลัมน์พิเศษสองสามคอลัมน์ในตารางที่สองและคำตอบที่ยอมรับใช้ไม่ได้กับ MSSQL เนื่องจากจำเป็นต้องเหมือนกัน
Tony M

39

คำตอบของ Jarrett สร้างตารางใหม่

คำตอบของ Scott แทรกลงในตารางที่มีอยู่ซึ่งมีโครงสร้างเดียวกัน

คุณยังสามารถแทรกลงในตารางที่มีโครงสร้างต่างกัน:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]

6
@ScottStonehouse: ถ้าคุณรวบรวมคำตอบอื่น ๆ ทั้งหมดไว้ในคำตอบนี้เหมือนที่คุณเคยทำ แต่ใช้รหัส (ทำให้ครอบคลุม) คุณจะกลายเป็นคำตอบที่ดีที่สุด
Michael Haren

6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

ทำงานใน SQL Server


2
สิ่งนี้ใช้ได้เฉพาะเมื่อไม่มี DestTable คุณจะได้รับข้อผิดพลาดหาก DestTable ถูกสร้างขึ้นก่อนแบบสอบถามนี้
Web-Developer

2
จริงๆแล้วจะล้มเหลวหากไม่มีตารางปลายทาง อาจทำให้เกิดข้อผิดพลาดหาก DestTable ที่มีอยู่ไม่ว่างเปล่า
Kaniu

5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >

1
มีวิธีใดบ้างในการดำเนินการนี้หากสองตารางนี้อยู่ในฐานข้อมูลที่แตกต่างกันใน sql-server
Naresh

9
ชัวร์! เพียงแค่มีคุณสมบัติครบถ้วนฐานข้อมูล [ชื่อเซิร์ฟเวอร์]. [สคีมา]. [ตาราง]. ยกตัวอย่างเช่นSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Jarrett เมเยอร์

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