[英]Error detection from Powershell Invoke-Sqlcmd not always working?
通过执行位于文件夹中的查询列表来更新数据库。
我需要能够检测到任何错误, 这些错误也会导致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
无论ErrorAction设置如何,invoke-sqlcmd cmdlet在SQL Server 2008,2008和2012版本的cmdlet中都存在一个错误,其中除以0之类的T-SQL错误不会导致错误。 我在此处记录了一个连接项,您可以在此处查看详细信息:
注意:该问题在SQL 2014中已得到修复,但似乎未出现或将要为以前的版本提供修复。
您通过使用-ErrorAction SilentlyContinue
忽略错误,将-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输出到变量 ,它正确地抛出错误。
正如拉夫的另一个答案中已经提到的那样; 未检测到错误的主要原因是-ErrorAction SilentlyContinue
(导致您绕过错误)。 如果你甚至完全省略了这个选项; 你会看到预期的错误
Invoke-Sqlcmd -ServerInstance .\SQLEXPRESS -Database Test -Query "select 1/0"
您也可以使用其他错误选项
停止运行错误-AbortOnError
显示错误-OutputSqlErrors
这些都在相关的MSDN文档中提到过。 看看Invoke-Sqlcmd cmdlet
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.