在PowerShell脚本中从Sqlcmd获取错误

时间:2019-06-08 06:19:04

标签: powershell sqlcmd

我为政府客户工作,我们的部署由另一个承包商控制,该承包商要求我们提供Powershell脚本来运行数据库脚本。不幸的是,安全性很严格,而且我没有添加Powershell管理单元的权限,因此我必须使用良好的旧sqlcmd而不是Invoke-Sqlcmd。我遇到了因运行脚本而产生的错误要传递回Powershell的麻烦。

例如,在下面的场景中,假设“ 02 test2.sql”有一个错误导致其无法运行。我想要终止脚本,将消息记录到控制台,并将sqlcmd的输出记录到文件中。无论我如何尝试,PowerShell都无法识别sqlcmd故障。

singleton

2 个答案:

答案 0 :(得分:1)

如果您仅将适当的输出流重定向到文件,则您的方法应该起作用。默认情况下,>>仅重定向成功流。错误流为22>>)。所有流都是**>>)。如果只想重定向错误和成功流,则可以将错误流发送到成功流,然后通过2>&1 >> Production.log.txt将成功流发送到文件。如果查询产生错误,$LastExitCode仍会提供1

示例:重定向所有流

ECHO "Running `"02 test2.sql`"" | tee -a Production.log.txt
sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" *>> Production.log.txt
if ($LASTEXITCODE -ne 0) {
    Write-Error "Error occured while running `"02 test2.sql`". Terminating script."
    TerminateScript
}

示例:重定向错误和成功流

sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" 2>&1 >> Production.log.txt

我知道这并不是您想要的,但这是另一种选择。您可以使用Start-Process来调用sqlcmd并重定向错误和成功流。请记住,每次运行时输出文件都会被覆盖。如果没有错误,error.txt文件将为空。

Start-Process sqlcmd -ArgumentList "-r -b /S poc-vtxrtndb2 /d test -i `"02 test2.sql`"" -NoNewWindow -RedirectStandardError error.txt -RedirectStandardoutput log.txt
if (Get-Content error.txt) {
    "There was an error in the script"
}

有关PowerShell输出重定向的更多信息,请参见About_Redirection

答案 1 :(得分:0)

不确定Invoke-Sqlcmd是否引发异常,但是如果发生异常,则可以捕获并记录该异常:

try {
   Invoke-Sqlcmd ... -ErrorAction Stop -Verbose *>> Production.log
} catch {
   Write-Error $_
   Write-Error "Exception: $($_.Exception)"
}

Docu

  

您可以通过指定Verbose参数来显示SQL Server消息输出,例如SQL PRINT语句所产生的消息。

通过*>>,我们将所有PowerShell streams重定向并将其附加到文件。

希望有帮助。