如何通过SQLCMD从SQL代码有条件地退出.BAT文件

时间:2016-12-20 16:06:25

标签: tsql batch-file cmd error-handling sqlcmd

我有一个.bat(Windows命令)文件,其中包含对SQLCMD和其他命令的调用。 (当然SQLCMD正在将我的T-SQL代码发送到SQL Server。)我想检测SQL代码中的某些条件,并有条件地退出整个批处理文件。我尝试了RAISERROR,THROW和故意除以0的各种组合(我并不自豪)以及SQLCMD上的各种命令行开关和.bat文件中错误级别的处理。

我尝试了5789568的答案,但在我的情况下无法让它发挥作用。这是两个显示失败尝试的文件。如果有超过3个表,它会尝试中止。但它不会中止bat文件,因为你可以看到最后的命令(echo)执行时。它甚至不会中止SQLCMD的运行,因为你可以看到它何时告诉你有多少个表。

example.bat

set ERRORLEVEL=0
sqlcmd -b -S dbread.vistaprint.net -E -d columbus -e -i example.sql
if %ERRORLEVEL% neq 0 exit /b %ERRORLEVEL%
echo we got to the end of the BAT file

example.sql

SET XACT_ABORT ON
if ((SELECT COUNT(*) FROM sys.tables) > 3)
    begin
    RAISERROR ('There are more than 3 tables.  We will try to stop', 18, -1)
    end
SELECT COUNT(*) FROM sys.tables

2 个答案:

答案 0 :(得分:0)

<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> <p> How many finger ? </p> <p><input id="myNum" type="text"</p> <button id="guess"> Mafia </button> <script type="text/javascript"> document.getElementById('guess').onclick=function(){ var myNumber=document.getElementById('myNum').value; var GotIt=False; var NumOfGuess=0; while(GotIt==False) { var guess=Math.random(); guess=guess*6; guess=Math.floor(guess); if(guess==myNumber) { GotIt==True; alert("Got It"); alert("You took"+ NumOfGuess +"guess"); } else { NumOfGuess+=1; } } } </script> </body> </html> 不是正常的环境变量。它是一个动态伪变量,返回当前的ERRORLEVEL。如果使用%ERRORLEVEL%显式定义真实环境变量,则会破坏动态特性,set ERRORLEVEL=0将永远返回用户定义环境变量的值。你应该 从不 为ERRORLEVEL,RANDOM,CD,TIME,DATE等定义你自己的值。

如果要清除ERRORLEVEL,则必须执行将值设置为0的命令。我喜欢使用%ERRORLEVEL%

假设您的代码没有其他问题,应该修复以下内容:

(call )

(call ) sqlcmd -b -S dbread.vistaprint.net -E -d columbus -e -i example.sql if %ERRORLEVEL% neq 0 exit /b %ERRORLEVEL% echo we got to the end of the BAT file 是一个外部命令(exe程序),所以它总是设置ERRORLEVEL。因此,您不必清除ERRORLEVEL,并且可以删除sqlcmd。在运行成功时未将ERRORLEVEL设置为0的内部命令之前,您只需要担心清除ERRORLEVEL。 (请参阅Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?

答案 1 :(得分:0)

@ dbenson的答案解决了.bat文件的问题。但是.sql文件也存在问题,其症状是尽管出现错误但最后一行仍然执行。这是一个完整的解决方案。也就是说,这两个文件可以正常工作。

代码检查的“错误”是名为“master”的数据库存在。如果将'master'替换为不是数据库名称的东西,它将运行而不会出错。

<强> example.bat

REM Replace the server name with any SQL Server server to which you
REM have at least read access.  The contents of the server don't matter.
sqlcmd -b -S dbread.vistaprint.net -E -i example.sql
if %errorlevel% neq 0 exit /b %errorlevel%
echo 'In the .bat file, we got past the error check, so run was successful.'

REM Replace the server name with any SQL Server server to which you REM have at least read access. The contents of the server don't matter. sqlcmd -b -S dbread.vistaprint.net -E -i example.sql if %errorlevel% neq 0 exit /b %errorlevel% echo 'In the .bat file, we got past the error check, so run was successful.'

<强> example.sql

if exists (select * from master.sys.databases where name = 'master')
    begin
    RAISERROR ('Found an error condition', 18, 10)
    return
    end
print 'In the SQL file, we got past the error check, so run was successful.'