一尘不染

从Powershell Invoke-Sqlcmd进行错误检测并非总是有效?

sql

通过执行位于文件夹中的查询列表来更新数据库。

我需要能够检测到也会导致SQL Server Management Studio中“错误完成查询”的 任何 错误。

下面的工作来检测“无效的对象”错误:

PS SQLSERVER:\> $ErrorActionPreference
Stop
PS SQLSERVER:\> $Error.Clear()
PS SQLSERVER:\> $Error
PS SQLSERVER:\> Invoke-Sqlcmd -ServerInstance .\SQLEXPRESS -Database Test -Query "select * from doesnotexist" -ErrorAction SilentlyContinue
PS SQLSERVER:\> $Error.Exception
Invalid object name 'doesnotexist'.
PS SQLSERVER:\>

做同样的选择1/0确实 工作:

PS SQLSERVER:\> $ErrorActionPreference
Stop
PS SQLSERVER:\> $Error.Clear()
PS SQLSERVER:\> $Error
PS SQLSERVER:\> Invoke-Sqlcmd -ServerInstance .\SQLEXPRESS -Database Test -Query "select 1/0" -ErrorAction SilentlyContinue
PS SQLSERVER:\> $Error.Exception
PS SQLSERVER:\>

我希望这会导致“遇到零除错误”错误,就像在SSMS中一样。

没有检测到此特定错误,使我想知道是否还会保留其他错误。

知道为什么会发生这种情况以及如何确保可以检测到 所有 错误吗?

更新

事实证明,我要安装的服务器上没有Invoke-Sqlcmd,因此,第二想我必须使用sqlcmd.exe。

我认为这对我有用:

$tempfile = [io.path]::GetTempFileName()
$cmd = [string]::Format("sqlcmd -S {0} -U {1} -P {2} -d {3} -i {4} -b > $tempfile",
    $g_connectionstring."Data Source",
    $g_connectionstring."User ID",
    $g_connectionstring."Password",
    $g_connectionstring."Initial Catalog",
    $path)
Invoke-Expression -Command $cmd
if ($LASTEXITCODE)
{
    $err = Get-Content $tempfile | Out-String
    Corax-Message "SQL" "Error" $err
    exit
}
Remove-Item $tempfile

阅读 140

收藏
2021-03-10

共1个答案

一尘不染

无论ErrorAction设置如何,invoke-sqlcmd cmdlet在SQL Server 2008、2008
R2和2012版本的cmdlet中都存在一个错误,在该错误中,除以0之类的T-SQL错误不会导致错误。我在此上记录了一个连接项,您可以在此处查看详细信息:

https://connect.microsoft.com/SQLServer/feedback/details/779320/invoke-
sqlcmd-does-not-return-t-sql-
errors

注意:此问题已在SQL 2014中修复,但是似乎未解决或将为以前的版本提供。

2021-03-10