【问题标题】:PowerShell Function multiple SQL queries output as CSVPowerShell 函数将多个 SQL 查询输出为 CSV
【发布时间】:2015-05-04 23:02:18
【问题描述】:

我在让 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-server tsql powershell csv


    【解决方案1】:

    我不确定 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
    

    【讨论】:

    • 太搞笑了!这就是我最初的做法,如我的问题here 中所见,我会解决这个问题并报告!谢谢!
    • 请原谅我的无知!在我原来的问题中,观察我的函数调用省略了第二个参数!!!!添加它会导致脚本完美循环,感谢您引导我回到理智的 Bluecakes!
    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多