Powershell Invoke-Sqlcmd的错误检测并不总是有效?

 zf72ayw 发布于 2023-01-16 17:17

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

我需要能够检测到任何错误,这些错误也会导致SQL Server Management Studio中的"Query completed with errors".

以下工作检测"无效对象"错误:

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中的"遇到零除错误"错误.

没有检测到这个特定的错误让我想知道其他错误是否仍然未被发现.

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

UPDATE

事实证明我在安装的服务器上没有可用的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

Chad Miller.. 7

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

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

注意:该问题在SQL 2014中已得到修复,但似乎未出现或将要为以前的版本提供修复.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有