ด้วย PowerShell คุณสามารถแก้ปัญหาได้อย่างเรียบร้อยโดยการต่อท่อ Invoke-Sqlcmd ไปยัง Export-Csv
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
-Database AdventureWorksDW2012 `
-Server localhost |
Export-Csv -NoTypeInformation `
-Path "DimDate.csv" `
-Encoding UTF8
SQL Server 2016 ประกอบด้วยโมดูลSqlServerซึ่งมีInvoke-Sqlcmd
cmdlet ซึ่งคุณจะมีแม้ว่าคุณจะเพิ่งติดตั้ง SSMS 2016 ก่อนหน้านั้น SQL Server 2012 รวมโมดูลSQLPSเก่าซึ่งจะเปลี่ยนไดเร็กทอรีปัจจุบันเป็นSQLSERVER:\
เมื่อโมดูลเป็น ใช้ครั้งแรก (ท่ามกลางข้อบกพร่องอื่น ๆ ) ดังนั้นคุณจะต้องเปลี่ยน#Requires
บรรทัดด้านบนเป็น:
Push-Location $PWD
Import-Module -Name SQLPS
Invoke-Sqlcmd -Query "SELECT 1" `
-Database AdventureWorksDW2012 `
-Server localhost |Out-Null
Pop-Location
ในการปรับตัวอย่างสำหรับ SQL Server 2008 และ 2008 R2 ให้ลบ#Requires
บรรทัดทั้งหมดและใช้ยูทิลิตี้ sqlps.exeแทนโฮสต์ PowerShell มาตรฐาน
Invoke-Sqlcmdเทียบเท่า PowerShell ของ sqlcmd.exe แทนที่จะเป็นข้อความจะส่งออกอ็อบเจ็กต์System.Data.DataRow
-Query
พารามิเตอร์การทำงานเช่น-Q
พารามิเตอร์ของ sqlcmd.exe ส่งแบบสอบถาม SQL ที่อธิบายข้อมูลที่คุณต้องการส่งออก
-Database
พารามิเตอร์การทำงานเช่น-d
พารามิเตอร์ของ sqlcmd.exe ส่งชื่อของฐานข้อมูลที่มีข้อมูลที่จะส่งออก
-Server
พารามิเตอร์การทำงานเช่น-S
พารามิเตอร์ของ sqlcmd.exe ส่งชื่อของเซิร์ฟเวอร์ที่มีข้อมูลที่จะส่งออก
Export-CSVคือ PowerShell cmdlet ที่จัดลำดับออบเจ็กต์ทั่วไปเป็น CSV มาพร้อมกับ PowerShell
-NoTypeInformation
พารามิเตอร์ยับยั้งเอาท์พุทพิเศษที่ไม่ได้เป็นส่วนหนึ่งของรูปแบบรูปแบบ CSV ตามค่าเริ่มต้น cmdlet จะเขียนส่วนหัวด้วยข้อมูลประเภท ช่วยให้คุณทราบประเภทของออบเจ็กต์เมื่อคุณยกเลิกการกำหนดค่าในภายหลังด้วยImport-Csv
แต่ทำให้สับสนกับเครื่องมือที่คาดว่าจะได้รับ CSV มาตรฐาน
-Path
พารามิเตอร์การทำงานเช่น-o
พารามิเตอร์ของ sqlcmd.exe เส้นทางแบบเต็มสำหรับค่านี้จะปลอดภัยที่สุดหากคุณติดอยู่โดยใช้โมดูลSQLPS แบบเก่า
-Encoding
พารามิเตอร์ทำงานเหมือน-f
หรือ-u
พารามิเตอร์ของ sqlcmd.exe โดยค่าเริ่มต้น Export-Csv จะแสดงเฉพาะอักขระ ASCII และแทนที่เครื่องหมายคำถามอื่น ๆ ทั้งหมด ใช้ UTF8 แทนเพื่อรักษาอักขระทั้งหมดและเข้ากันได้กับเครื่องมืออื่น ๆ ส่วนใหญ่
ข้อได้เปรียบหลักของโซลูชันนี้สำหรับ sqlcmd.exe หรือ bcp.exe คือคุณไม่ต้องแฮ็กคำสั่งเพื่อส่งออก CSV ที่ถูกต้อง cmdlet Export-Csv จะจัดการทุกอย่างให้คุณ
ข้อเสียเปรียบหลักคือInvoke-Sqlcmd
อ่านชุดผลลัพธ์ทั้งหมดก่อนที่จะส่งต่อไปตามท่อ ตรวจสอบให้แน่ใจว่าคุณมีหน่วยความจำเพียงพอสำหรับชุดผลลัพธ์ทั้งหมดที่คุณต้องการส่งออก
อาจทำงานได้ไม่ราบรื่นสำหรับหลายพันล้านแถว หากเป็นปัญหาคุณสามารถลองใช้เครื่องมืออื่น ๆ หรือInvoke-Sqlcmd
ใช้ คลาสSystem.Data.SqlClient.SqlDataReader ที่มีประสิทธิภาพของคุณเอง