การคัดลอกตาราง (หลายร้อย) จากเซิร์ฟเวอร์หนึ่งไปยังอีก (ด้วย SSMS)


27

ฉันมีตารางหลายร้อย (ปัจจุบัน 466 แต่เคยเติบโต) ตารางฉันต้องคัดลอกจากเซิร์ฟเวอร์หนึ่งไปยังอีก

ฉันไม่เคยทำแบบนี้มาก่อนดังนั้นฉันไม่แน่ใจเลยว่าจะเข้าใกล้มันอย่างไร ตารางทั้งหมดอยู่ในรูปแบบเดียวกัน:Cart<Eight character customer number>

นี่เป็นส่วนหนึ่งของโครงการขนาดใหญ่ที่ฉันรวมCart<Number>ตารางเหล่านี้ทั้งหมดเข้ากับตารางเดียวCartsแต่นั่นเป็นคำถามที่แตกต่างกันโดยสิ้นเชิง

ใครบ้างมีวิธีปฏิบัติที่ดีที่สุดที่ฉันสามารถใช้เพื่อคัดลอกตารางเหล่านี้ทั้งหมดหรือไม่ ชื่อฐานข้อมูลบนเซิร์ฟเวอร์ทั้งสองจะเหมือนกันหากเป็นเช่นนั้น และอย่างที่ฉันบอกไว้ก่อนหน้านี้ฉันมีsaบัญชีเพื่อให้ฉันสามารถทำสิ่งที่จำเป็นเพื่อรับข้อมูลจาก A ถึง B เซิร์ฟเวอร์ทั้งสองอยู่ในเซิร์ฟเวอร์ฟาร์มเดียวกันเช่นกัน


2
อาจเป็นไปได้ที่น่าสนใจdba.stackexchange.com/questions/30473/ …
billinkc

คำตอบ:


21

คุณสามารถใช้งาน "ส่งออกข้อมูล" ของ Studio Server Management Studio คลิกขวาที่ฐานข้อมูลใน SSMS เลือกงานแล้วเลือก "ส่งออกข้อมูล" มันจะเปิดตัวช่วยสร้างการโต้ตอบที่จะช่วยให้การคัดลอกตารางจากเซิร์ฟเวอร์หนึ่งไปยังอีกแม้ว่าคุณจะต้องสร้างดัชนีตัวเอง ตัวช่วยสร้างสร้างแพ็คเกจ SSIS ชั่วคราว (แม้ว่าคุณสามารถเลือกที่จะบันทึกได้) และค่อนข้างเร็ว


4
ยังสามารถทำงานส่งออกเดียวกันผ่าน PowerShell หากสนใจ สคริปต์ที่คล้ายกันเพื่อดำเนินการนี้อยู่ในคำตอบของฉันที่นี่: dba.stackexchange.com/a/122149/507
Shawn Melton

เหตุใดการนำเข้า / ส่งออกจึงไม่คัดลอกดัชนีและการอ้างอิง มันจะไม่ยากเกินไปที่จะสร้างดัชนีใหม่สำหรับ 466 ตารางหรือไม่
Vini

@Vini คุณยังสามารถใช้ตัวช่วยสร้างสคริปต์ซึ่งอนุญาตให้คุณคัดลอกดัชนี (ฉันไม่รู้ว่ามันสร้างสคริปต์ที่เชื่อถือได้ตามลำดับการพึ่งพาที่เหมาะสมแม้ว่า - ฉันเคยใช้ RedGate SQL Compare มาแล้ว)
Aaron Bertrand

@AaronBertrand: ตกลง ฉันก็มีคำถามเดียวกัน แต่เมื่อฉันนำเข้าวันที่และเวลาถูกเปลี่ยนเป็นช่วงเวลาเล็ก ๆ ด้วย
Vini

23

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

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * INTO [database].dbo.' + QUOTENAME(name)
  + N' FROM [source_linked_server].[database].dbo.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE name LIKE N'Cart[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

PRINT @sql; -- this will only print 8K, enough to spot check
--EXEC [destination_linked_server].master.sys.sp_executesql @sql;

19

หากคุณต้องการบางสิ่งที่สามารถเขียนสคริปต์ให้เรียกใช้ซ้ำได้ง่ายในขณะที่คุณทดสอบและทำการเปลี่ยนแปลงเล็กน้อยลองดูคำตอบของฉันที่นี่:

นำเข้าข้อมูลจากฐานข้อมูลหนึ่งไปยังสคริปต์อื่น

คำตอบนั้นอธิบายถึงการใช้ SQLCLR ที่เก็บไว้ในโพรซีเดอร์ซึ่งใช้SqlBulkCopyคลาสใน. NET การใช้โพรซีเดอร์ที่เก็บไว้สามารถทำได้ในเคอร์เซอร์ที่วนรอบตาราง ซึ่งช่วยให้การแก้ไขกระบวนการทำได้ง่ายเช่นเดียวกับการบัญชีสำหรับตารางใหม่หรือยกเว้นตารางอย่างน้อยหนึ่งตารางผ่านWHEREเงื่อนไขในแบบสอบถามเคอร์เซอร์ได้อย่างง่ายดาย


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