PowerShell 函数多个 SQL 查询输出为 CSV

PowerShell Function multiple SQL queries output as CSV

我在让 PowerShell 运行 多个 SQL 查询并将结果导出为 CSV 时遇到问题。

我正在尝试使用 Function 来完成此操作,但是当我希望对 运行 进行两次查询并输出两个 CSV 文件时,问题出现在 Process 块中。

我尝试为 运行 查询创建一个函数,并尝试创建第二个函数来创建 CSV 文件,但这甚至没有 运行 SQL 查询。我这样做时没有在执行此 powershell 脚本的位置安装 SQL。 -谢谢!

Function Run-Query {
 param([string[]]$queries,[string[]]$sheetnames)
Begin{
 $SQLServer = 'ServerName'
 $Database = 'DataBase'
 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
 $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $Database; Integrated Security = True"
}#End Begin
Process{
 $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
 $SqlCmd.CommandText = $queries
 $SqlCmd.Connection = $SqlConnection
 $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
 $SqlAdapter.SelectCommand = $SqlCmd
 $DataSet = New-Object System.Data.DataSet
 $SqlAdapter.Fill($DataSet)
 $DataSet.Tables[0] | Export-Csv -NoTypeInformation -Path "C:\Scripts$sheetnames.csv"
}#End Process
End{
 $SqlConnection.Close()
}
}#End function run-query.
$queries = @()
 $queries += @'
Select * from something
'@
 $queries += @'
Select * from something2
'@
$sheetnames = @()
$sheetnames += 'Cert'
$sheetnames += 'Prod'
Run-Query -queries $queries

我不确定 SQL 是否分别处理多个查询,因此当您可能传递两个不同的查询时,SQL 服务器可能会将它们解释为一个查询(不能 100% 确定这是发生了,真的只是猜测)

您已将查询放在一个数组中,这样我们就可以轻松地遍历数组,运行每个查询本身并将结果放入 CSV 文件中。

以下是我修改您的代码的方式:

Function Run-Query
{
    param([string[]]$queries,[string[]]$sheetnames)
    Begin
    {
        $SQLServer = 'ServerName'
        $Database = 'DataBase'
        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
        $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $Database; Integrated Security = True"
    }#End Begin
    Process
    {
        # Loop through each query
        For($i = 0; $i -lt $queries.count; $i++)
        {
            $SqlCmd = New-Object System.Data.SqlClient.SqlCommand

            # Use the current index ($i) to get the query
            $SqlCmd.CommandText = $queries[$i]

            $SqlCmd.Connection = $SqlConnection
            $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
            $SqlAdapter.SelectCommand = $SqlCmd
            $DataSet = New-Object System.Data.DataSet
            $SqlAdapter.Fill($DataSet)

            # Use the current index ($i) to get the sheetname for the CSV
            $DataSet.Tables[0] | Export-Csv -NoTypeInformation -Path "C:\Scripts$($sheetnames[$i]).csv"
        }
    }#End Process
    End
    {
        $SqlConnection.Close()
    }
}#End function run-query.

$queries = @()

$queries += @'
Select * from something
'@
$queries += @'
Select * from something2
'@

$sheetnames = @()
$sheetnames += 'Cert'
$sheetnames += 'Prod'

Run-Query -queries $queries -sheetnames $sheetnames