【问题标题】:Error detection from Powershell Invoke-Sqlcmd not always working?Powershell Invoke-Sqlcmd 的错误检测并不总是有效?
【发布时间】:2014-06-21 16:52:48
【问题描述】:

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

我需要能够检测到任何错误,这些错误也会导致 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:\>

对 select 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

【问题讨论】:

    标签: sql powershell error-handling


    【解决方案1】:

    您使用-ErrorAction SilentlyContinue 忽略了错误,请将其更改为-ErrorAction Stop

    编辑:

    事实证明,如果您想要错误处理,请不要使用 Invoke-SqlCmd (http://blogs.technet.com/b/heyscriptingguy/archive/2013/05/06/10-tips-for-the-sql-server-powershell-scripter.aspx)

    您可以从这个答案中使用GenericSqlQuery 函数:Powershell SQL SELECT output to variable 正确抛出错误。

    【讨论】:

      【解决方案2】:

      正如 Raf 在另一个答案中已经提到的那样;未检测到错误的主要原因是-ErrorAction SilentlyContinue(因为您正在绕过错误)。如果您甚至完全忽略此选项;你会看到预期的错误

      Invoke-Sqlcmd -ServerInstance .\SQLEXPRESS -Database Test -Query "select 1/0"
      

      您也可以使用其他错误选项,例如

      出现错误时停止运行 -AbortOnError

      显示错误 -OutputSqlErrors

      在相关的 MSDN 文档中都有提及。看看Invoke-Sqlcmd cmdlet

      【讨论】:

        【解决方案3】:

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

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

        注意:该问题已在 SQL 2014 中修复,但似乎已经或将不会为以前的版本提供修复。

        【讨论】:

        • 谢谢,这可以解释为什么我没有看到 any 错误。
        • 我刚刚注意到我在运行脚本的 VM 上只有 Microsoft® Command Line Utilities 11 for SQL Server® 可用,因此只有 sqlcmd.exe 而没有 Invoke-Sqlcmd。所以我必须弄清楚如何从 Powershell 中的 sqlcmd.exe 中捕获错误。但我想那是另一个故事了……
        • 也许这会对你有所帮助,我的 sqlcmd.exe Powershell 包装器:sev17.com/2012/11/12/sqlcmd-is-dead-long-live-sqlcmd
        猜你喜欢
        • 2021-12-17
        • 2018-07-15
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        相关资源
        最近更新 更多