Dengan PowerShell Anda dapat menyelesaikan masalah dengan rapi dengan mem-pipkan Invoke-Sqlcmd ke Export-Csv.
#Requires -Module SqlServer
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
-Database AdventureWorksDW2012 `
-Server localhost |
Export-Csv -NoTypeInformation `
-Path "DimDate.csv" `
-Encoding UTF8
SQL Server 2016 termasuk modul SqlServer , yang berisi Invoke-Sqlcmd
cmdlet, yang akan Anda miliki bahkan jika Anda baru saja menginstal SSMS 2016. Sebelum itu, SQL Server 2012 menyertakan modul SQLPS lama , yang akan mengubah direktori saat ini SQLSERVER:\
ketika modul itu pertama kali digunakan (di antara bug lain) jadi untuk itu, Anda harus mengubah #Requires
baris di atas menjadi:
Push-Location $PWD
Import-Module -Name SQLPS
# dummy query to catch initial surprise directory change
Invoke-Sqlcmd -Query "SELECT 1" `
-Database AdventureWorksDW2012 `
-Server localhost |Out-Null
Pop-Location
# actual Invoke-Sqlcmd |Export-Csv pipeline
Untuk mengadaptasi contoh untuk SQL Server 2008 dan 2008 R2, hapus #Requires
baris seluruhnya dan gunakan utilitas sqlps.exe alih-alih host PowerShell standar.
Invoke-Sqlcmd adalah PowerShell yang setara dengan sqlcmd.exe. Alih-alih teks itu output objek System.Data.DataRata .
The -Query
parameter bekerja seperti -Q
parameter sqlcmd.exe. Berikan SQL query yang menjelaskan data yang ingin Anda ekspor.
The -Database
parameter bekerja seperti -d
parameter sqlcmd.exe. Berikan nama database yang berisi data yang akan diekspor.
The -Server
parameter bekerja seperti -S
parameter sqlcmd.exe. Berikan nama server yang berisi data yang akan diekspor.
Ekspor-CSV adalah cmdlet PowerShell yang membuat serialisasi objek umum ke CSV. Ini dikirimkan dengan PowerShell.
The -NoTypeInformation
parameter menekan keluaran tambahan yang bukan merupakan bagian dari format CSV. Secara default cmdlet menulis header dengan informasi jenis. Ini memungkinkan Anda mengetahui jenis objek ketika Anda deserialize nanti dengan Import-Csv
, tetapi membingungkan alat yang mengharapkan CSV standar.
The -Path
parameter bekerja seperti -o
parameter sqlcmd.exe. Jalur lengkap untuk nilai ini paling aman jika Anda terjebak menggunakan modul SQLPS lama .
The -Encoding
parameter bekerja seperti -f
atau -u
parameter sqlcmd.exe. Secara standar Export-Csv hanya menghasilkan karakter ASCII dan mengganti yang lainnya dengan tanda tanya. Gunakan UTF8 sebagai gantinya untuk mempertahankan semua karakter dan tetap kompatibel dengan sebagian besar alat lainnya.
Keuntungan utama dari solusi ini daripada sqlcmd.exe atau bcp.exe adalah Anda tidak perlu meretas perintah untuk mengeluarkan CSV yang valid. Cmdlet Export-Csv menangani semuanya untuk Anda.
Kerugian utama adalah Invoke-Sqlcmd
membaca seluruh hasil yang ditetapkan sebelum melewati sepanjang pipa. Pastikan Anda memiliki cukup memori untuk seluruh rangkaian hasil yang ingin Anda ekspor.
Ini mungkin tidak berfungsi dengan baik untuk miliaran baris. Jika itu masalah, Anda bisa mencoba alat lain, atau memutar versi efisien Anda sendiri Invoke-Sqlcmd
menggunakan kelas System.Data.SqlClient.SqlDataReader .