从 PowerShell 脚本中的 Sqlcmd 获取错误

Getting errors from Sqlcmd in PowerShell script

我为政府客户工作,我们的部署由另一个承包商控制,该承包商要求我们为 运行 我们的数据库脚本提供 powershell 脚本。不幸的是,安全性很严格,我没有添加 powershell 管理单元的权限,所以我必须使用旧的 sqlcmd 而不是 Invoke-Sqlcmd。我无法将 运行 将脚本生成的错误传回 powershell。

例如,假设在下面的场景中,“02 test2.sql”有一个错误导致它无法 运行。我希望这样可以终止脚本,向控制台记录一条消息,并将 sqlcmd 的输出记录到一个文件中。无论我尝试什么,我似乎都无法得到 PowerShell 无法识别的 sqlcmd 失败。

function TerminateScript {
    ECHO "Please email `"Production.log.txt`" to address@mail.com"
    Read-Host -Prompt "Press Enter to exit"
    exit 1
}

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

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
}

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

不确定 Invoke-Sqlcmd 是否抛出异常,但如果是,您可以捕获并记录它:

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

Docu:

You can display SQL Server message output, such as those that result from the SQL PRINT statement, by specifying the Verbose parameter.

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

希望对您有所帮助。

如果您只是将正确的输出流重定向到您的文件,您的方法应该有效。 >> 默认情况下只重定向成功流。错误流是 2 (2>>)。所有流都是 * (*>>)。如果您只想重定向错误和成功流,您可以将错误流发送到成功流,然后通过 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