バッチファイルやPowerShellでSQL ServerのデータをCSV出力する
SQL Server 2017のデータを定期的(タスクスケジューラ等で)にCSV(タブ区切り)のShift-JISで出力したい。
*SQLiteに取り込みたいのでヘッダーは"なし"にしている。
バッチファイル (sqlcmdを使用)
sample1.bat
@echo off set db_server=HogeSql set db_database=HogeDb set db_user=sa set db_password=PassW0rd set db_param='りんご' sqlcmd -S %db_server% -U %db_user% -P %db_password% -d %db_database% -i .\sample1.sql -v Param1=%db_param% -b -s"<tab>" -h -1 -W -o .\sample1.csv
<tab>
と書いている箇所には、タブ記号(タブキー)を入力すること
sample1.sql
SET NOCOUNT ON SELECT * FROM ITEM_TBL WHERE ITEM_NAME = $(Param1) SET NOCOUNT OFF
SET NOCOUNT ON
、SET NOCOUNT OFF
を記入しないと"(1 行処理されました)"等のメッセージも出力される。
$(Param1)
に代入されている値には、' (シングルクォーテーション)
の記号も含まれる。
PowerShell (Invoke-Sqlcmdを使用) その1
sample2.ps1
$db_server = "HogeSql" $db_database = "HogeDb" $db_user = "sa" $db_password = "PassW0rd" $db_params = @("Param1='りんご'") $ret = Invoke-Sqlcmd -InputFile ".\sample2.sql" -Variable $db_params -ServerInstance $db_server -Database $db_database -Username $db_user -Password $db_password | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation $ret | Select-Object -Skip 1 | % {$_ -replace '"', ""} | Out-File (".\sample2.csv") -Force -Encoding oem
1行目にヘッダーがあり、データも" (ダブルクオーテーション)
で囲まれているので、それらを削除している。
出力フォーマットはShift-JISにする。
sample2.sql
SELECT * FROM ITEM_TBL WHERE ITEM_NAME = $(Param1)
SET NOCOUNT ON
、SET NOCOUNT OFF
は必要でない。
PowerShell (Invoke-Sqlcmdを使用) その2
sample3.ps1
$db_server = "HogeSql" $db_database = "HogeDb" $db_user = "sa" $db_password = "PassW0rd" $db_params = @("Param1='りんご'") $sql_command = "SELECT * FROM ITEM_TBL WHERE ITEM_NAME = `$(Param1)" $ret = Invoke-Sqlcmd -Query $sql_command -Variable $db_params -ServerInstance $db_server -Database $db_database -Username $db_user -Password $db_password | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation $ret | Select-Object -Skip 1 | % {$_ -replace '"', ""} | Out-File (".\sample3.csv") -Force -Encoding oem
SQLのスクリプトファイルは使用せず、直接SQLを書いている。
このとき、SQLの変数`$(Param1)
の"$"の前には` (バッククォート)
を付加すること。
そうしないとPowerShellの変数として扱われ展開されるので。
参考URL
powershell - Invoke-sqlcmd output without "quotes" and headers - Stack Overflow