2

我从 PowerShell 调用 sqlcmd 来执行 T-SQL 脚本。目前,如果使用的数据违反约束等导致错误,我正在使用“:On Error exit”退出脚本。这由PowerShell检测$SqlcmdProcess.ExitCode 1来处理。

但是,如果数据库存在连接问题,sqlcmd 也会给出 1 的 ExitCode。有没有办法将 :On Error ExitCode 设置为 1 以外的值?我知道使用类似 :Exit(SELECT 2) 的东西来执行此操作,但我宁愿仍然使用 :On Error 这样我就不必重写脚本。

4

1 回答 1

0

您可以在 Powershell 中使用 exit 关键字。这是一个例子

创建一个名为 sqlcmdexit.ps1 的脚本,其内容如下:

$result = sqlcmd -S"missing" -d master -Q "select @@servername"
if ($result[1] -like "*Error Locating Server/Instance Specified*" -or $result[1] -like "*Could not open a connection to SQL Server*") {
    exit 99
}

调用脚本并观察现有代码:

C:\Users\Public\bin>.\sqlcmdExit.ps1
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or instance-specific error has occurred while
 establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and i
f SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.

C:\Users\Public\bin>$LASTEXITCODE
99

我不知道有什么方法可以设置默认的 ExitCode。使用 start-process 你可以做类似的事情:

$tempFile = [io.path]::GetTempFileName()
$exitCode = (Start-Process -FilePath "sqlcmd.exe" -ArgumentList @"
-S"missing" -d master -Q "select @@servername"
"@ -Wait -NoNewWindow -RedirectStandardOutput $tempFile -Passthru).ExitCode

if ($exitCode -eq 1) {
    $result = get-content $tempfile
    if ($result[1] -like "*Error Locating Server/Instance Specified*" -or $result[1] -like "*Could not open a connection to SQL Server*") {
        remove-item $tempFile
        Exit 99
    }
}
else {
    remove-item $tempfile
    Exit $exitCode
}
于 2012-07-25T15:15:38.843 回答