Sql server 从SQL Server过程调用返回错误代码和事件
我正在尝试设置Powershell脚本以运行某些SQL Server存储过程。最初,脚本仅返回零或非零返回代码(通过计算catch块),具体取决于过程调用是否失败: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
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
}