Saya dapat dengan mudah membuang data ke file teks seperti:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable"
-o "MyData.txt"
Namun, saya telah melihat file bantuan untuk SQLCMD
tetapi belum melihat opsi khusus untuk CSV.
Apakah ada cara untuk membuang data dari tabel ke file teks CSV menggunakan SQLCMD
?
sql-server
file
csv
sqlcmd
sinar
sumber
sumber
Jawaban:
Anda dapat menjalankan sesuatu seperti ini:
-h-1
menghapus tajuk nama kolom dari hasilnya-s","
set pemisah kolom menjadi,-w 700
set lebar baris menjadi 700 karakter (ini harus selebar baris terpanjang atau akan membungkus ke baris berikutnya)sumber
'""' + col1 + '""' AS col1
, membungkus (dua kali lipat) tanda kutip ganda atau hanya memanggil prosedur tersimpan.Dengan PowerShell Anda dapat menyelesaikan masalah dengan rapi dengan mem-pipkan Invoke-Sqlcmd ke Export-Csv.
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 iniSQLSERVER:\
ketika modul itu pertama kali digunakan (di antara bug lain) jadi untuk itu, Anda harus mengubah#Requires
baris di atas menjadi: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 denganImport-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 .sumber
Baris terakhir berisi opsi spesifik CSV.
-W
menghapus spasi tambahan dari setiap bidang individu-s","
set pemisah kolom ke koma (,)-w 999
set lebar baris menjadi 999 karakterJawaban scottm sangat dekat dengan apa yang saya gunakan, tetapi saya menemukan itu
-W
menjadi tambahan yang sangat bagus: Saya tidak perlu memotong spasi ketika saya mengkonsumsi CSV di tempat lain.Juga lihat referensi MSDN sqlcmd . Itu membuat
/?
output opsi menjadi malu.sumber
'""' + col1 + '""' AS col1
, membungkus (menggandakan) tanda kutip ganda atau hanya memanggil prosedur tersimpan.Apakah ini tidak
bcp
dimaksudkan untuk?Jalankan ini dari baris perintah Anda untuk memeriksa sintaks.
Sebagai contoh:
Harap perhatikan bahwa
bcp
tidak dapat menampilkan tajuk kolom.Lihat: halaman bcp Utility docs.
Contoh dari halaman di atas:
sumber
bcp
tidak termasuk header (nama kolom), tetapi ~ 10X lebih cepat darisqlcmd
(dari pengalaman saya). Untuk data yang sangat besar, Anda bisa menggunakanbcp
untuk mendapatkan data, dan menggunakansqlcmd
(pilih top 0 * dari ...) untuk mendapatkan tajuk, lalu gabungkan.Catatan untuk siapa pun yang ingin melakukan ini tetapi juga memiliki tajuk kolom, ini adalah solusi yang saya gunakan file batch:
Ini menampilkan hasil awal (termasuk pemisah ----, ---- antara header dan data) ke dalam file temp, kemudian menghapus baris itu dengan memfilternya melalui findstr. Perhatikan bahwa itu tidak sempurna karena memfilter
-,-
— itu tidak akan berfungsi jika hanya ada satu kolom di output, dan itu juga akan menyaring garis yang sah yang berisi string itu.sumber
Jawaban ini dibangun berdasarkan solusi dari @ iain-elder, yang berfungsi dengan baik kecuali untuk kasus basis data yang besar (seperti yang ditunjukkan dalam solusinya). Seluruh tabel harus sesuai dengan memori sistem Anda, dan bagi saya ini bukan pilihan. Saya menduga solusi terbaik akan menggunakan System.Data.SqlClient.SqlDataReader dan serializer CSV kustom ( lihat di sini untuk contoh ) atau bahasa lain dengan driver MS SQL dan serialisasi CSV. Dalam semangat pertanyaan asli yang mungkin mencari solusi tanpa ketergantungan, kode PowerShell di bawah ini berfungsi untuk saya. Ini sangat lambat dan tidak efisien terutama dalam instantiating $ data array dan memanggil Export-Csv dalam mode append untuk setiap baris $ chunk_size.
sumber
Opsi alternatif dengan BCP:
sumber
Biasanya
sqlcmd
dilengkapi denganbcp
utilitas (sebagai bagian darimssql-tools
) yang mengekspor ke CSV secara default.Pemakaian:
Sebagai contoh:
Untuk membuang semua tabel ke file CSV yang sesuai, berikut adalah skrip Bash :
sumber
Jawaban di atas hampir menyelesaikannya untuk saya tetapi tidak membuat CSV yang diuraikan dengan benar.
Ini versi saya:
Seseorang yang mengatakan bahwa
sqlcmd
itu sudah ketinggalan zaman mendukung beberapa alternatif PowerShell lupa bahwasqlcmd
itu tidak hanya untuk Windows. Saya di Linux (dan ketika di Windows saya tetap menghindari PS).Setelah mengatakan semua itu, saya merasa
bcp
lebih mudah.sumber
Karena mengikuti 2 alasan, Anda harus menjalankan solusi saya di CMD:
Nama pengguna dan kata sandi masuk kadang-kadang diperlukan untuk meminta contoh SQL Server jarak jauh
sumber
Anda bisa melakukannya dengan cara hack. Hati-hati menggunakan
sqlcmd
peretasan. Jika data memiliki tanda kutip ganda atau koma Anda akan mengalami masalah.Anda dapat menggunakan skrip sederhana untuk melakukannya dengan benar:
Sumber: Menulis output SQL ke CSV dengan VBScript .
sumber
sqlcmd
, kita hanya menyatakan fakta bahwasqlcmd
tidak lolos dari koma, sehingga hampir tidak dapat digunakan untuk output CSV yang serius .