Sql server 从SQL Server过程调用返回错误代码和事件

Sql server 从SQL Server过程调用返回错误代码和事件,sql-server,powershell,Sql Server,Powershell,我正在尝试设置Powershell脚本以运行某些SQL Server存储过程。最初,脚本仅返回零或非零返回代码(通过计算catch块),具体取决于过程调用是否失败: try { $command = New-Object System.Data.SqlClient.sqlCommand ("$query", $connection) $DataAdapter = new-object System.data.SqlClient.SqlDataA

我正在尝试设置Powershell脚本以运行某些SQL Server存储过程。最初,脚本仅返回零或非零返回代码(通过计算catch块),具体取决于过程调用是否失败:

try {
        $command = New-Object System.Data.SqlClient.sqlCommand ("$query", $connection)          
        $DataAdapter = new-object System.data.SqlClient.SqlDataAdapter $command
        $dataset = new-object System.data.Dataset

        $rowCount = $DataAdapter.Fill($dataset)
        if($rowCount -gt 0) {
            $DataAdapter.Fill($dataset) | Out-Null
            $return =,[int]$command.Parameters["@ReturnValue"].Value
            $return += ,$dataset.Tables[0].Rows[0]
        } else{
            $return=,[int]$command.Parameters["@ReturnValue"].Value             
        }
    }
    catch {
        $return=,10000
        throw
    }
现在,我想让它更有用一点,并在作业失败时返回错误消息。为此,我使用了
System.Data.SqlClient.SqlInfoMessageEventHandler
,它似乎可以工作,只是它不属于catch块,因此不会计算其他返回代码。这是代码(完整功能):

我不想评估返回消息以确定进程是否出错。有人能推荐一种方法或方法来捕获消息,以及一种完整的证明方法来证明proc调用成功或失败吗


干杯

也许您可以在
Try
子句中添加
$ErrorActionPreference='Stop'
。看看这是否有助于进入
Catch
子句。感谢@DarkLite1的回复。我试了一下,但没有任何乐趣。我还尝试将
FireInfoMessageEventOnUserErrors
设置为
$false
并在
catch
块中返回
$stuffedMessage
,但这会返回null。我可以对
$stuffedMessage
中的字符串进行比较,但我注意到这些值可能会不同,并且不像我希望的那样一致。您可以尝试使用
Invoke-Sqlcmd2
而不是创建自己的函数来触发存储过程。有一个关于如何启动存储过程的问题。最新版本可在上找到。也许这能帮到你。好吧,我不确定这是否是我需要的。如果出现SQL问题,我不希望脚本失败——我希望它返回SQL返回消息,以便可以在下游使用。使用-Verbose可以让脚本继续,但我不确定这在自动化生产环境中是否明智。我是powershell的新手(我的大多数其他脚本都是用Perl编写的),所以我仍在努力理解什么是可接受的实践,什么是不可接受的实践。@DarkLite1-感谢您的帮助。我越深入研究它,就越确定Invoke-Sqlcmd2可以做我想做的事情,只需做一些修改。我修改了它,以便在连接或查询失败时在数组中返回错误消息。我仍然需要切换并评估返回代码,但至少我知道是否存在故障。干杯
function Run-SQLQuery($dataSource, $database, $query) {
$stuffedMessage = ""
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $error) $stuffedMessage +=  "$($_)" };    
try {       
    try {
        $connectionString = "Data Source=$dataSource; " +
            "Integrated Security=SSPI; " +
            "Initial Catalog=$database"

        # Create a connection to the OLAP Database
        $connection = new-object system.data.SqlClient.SQLConnection($connectionString)         
        $connection.add_InfoMessage($handler); 
        $connection.FireInfoMessageEventOnUserErrors = $true;
        $connection.Open()
    }
    catch {
        $return = ,"unable to open connection"
        throw
    }

    try {
        $command = New-Object System.Data.SqlClient.sqlCommand ("$query", $connection)

        $DataAdapter = new-object System.data.SqlClient.SqlDataAdapter $command
        $dataset = new-object System.data.Dataset

        $rowCount = $DataAdapter.Fill($dataset)
        $return = ,$stuffedMessage
        $return +=[int]$command.Parameters["@ReturnValue"].Value
        if($rowCount -gt 0) {

            $DataAdapter.Fill($dataset) | Out-Null
            $return +=[int]$command.Parameters["@ReturnValue"].Value
            $return +=$dataset.Tables[0].Rows[0]
        } else{
            $return +=[int]$command.Parameters["@ReturnValue"].Value                
        }
    }
    catch {
        $return=,10000
        throw
    }       
    $connection.close()
}
catch {
}
Finally
{
    $connection.dispose()
    ,$return
}