【发布时间】: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