読者です 読者をやめる 読者になる 読者になる

入力パラメータが指定されていればWhere句の条件に追加する方法

PowerShellからSQLを使ってデータ抽出およびCSV出力したい場合の話。
その際、Where句の条件を入力パラメータとして指定して、入力パラメータがあればそのパラメータを条件として追加。
無い場合はWhere句の条件を付けずにSQLを実行する方法です。

Param(
    [Parameter(Mandatory = $true,Position = 0)]
    [DateTime]
    $a,
    [Parameter(Mandatory = $true,Position = 1)]
    [AllowEmptyString()]
    [String]
    $b
)

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")

$connectionString = "Data Source=.;Initial Catalog=[DB名];Integrated Security=True;"
$Con = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$Con.Open()

$Cmd = New-Object System.Data.SqlClient.SqlCommand
$Cmd.Connection = $Con

$DateFrom = $a.ToString('yyyy-MM-dd HH:mm:ss')

$SQL = "SELECT * FROM [dbo].[hogehoge] WHERE Column1 >= '$DateFrom'"

$Where_SQL = $null
#$bパラメータが指定されていた場合、SQLに条件を追加
if($b){
    $Where_SQL = "AND Column2 = '$b'"
}

$Cmd.CommandText = $SQL + $Where_SQL

$Datas = New-Object System.Collections.ArrayList
$ClientReader = $Cmd.ExecuteReader()
while ($ClientReader.Read()) {
    $Data = New-Object PSObject | Select-Object AttributeMask
    $Data.AttributeMask = $ClientReader["AttributeMask"].ToString()
    [void]$Datas.Add($Data)
} 

$OutputFilename = "C:\Temp\test.csv"
$Datas | Export-Csv $OutputFilename -Encoding Default

$ClientReader.Dispose()

$Con.Close()
$Con.Dispose()

$bは入力必須項目ですが、パラメータ検証属性「AllowEmptyString」付いているため空文字列を指定することが可能です。

$Where_SQL = $null
#$bパラメータが指定されていた場合、SQLに条件を追加
if($b){
    $Where_SQL = "AND Column2 = '$b'"
}

上記の条件分岐で$bパラメータが指定されていた場合は、$Where_SQLに条件を文字列として追加し、
$bパラメータが指定されていない場合は、$Where_SQLをNULLとします。

$Cmd.CommandText = $SQL + $Where_SQL

後は、変数を連結させれば終わり。