ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

バッチファイルや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 ONSET 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 ONSET 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