SQL Server 中的 T-SQL STOP 或 ABORT 命令
Microsoft SQL Server T-SQL 中是否有命令告诉脚本停止处理? 我有一个脚本,我想保留它以供存档,但我不希望任何人运行它。
Is there a command in Microsoft SQL Server T-SQL to tell the script to stop processing?
I have a script that I want to keep for archival purposes, but I don't want anyone to run it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
另一种解决方案可能是使用 GOTO 语句更改脚本的执行流程...
警告!上面的示例源自我从 Merrill Aldrich 获得的示例。在盲目实现 GOTO 语句之前,我建议您阅读他的教程 T-SQL 脚本中的流控制。
An alternate solution could be to alter the flow of execution of your script by using the
GOTO
statement...Warning! The above sample was derived from an example I got from Merrill Aldrich. Before you implement the
GOTO
statement blindly, I recommend you read his tutorial on Flow control in T-SQL Scripts.不,没有 - 你有几个选择:
将整个脚本包装在一个大的 if/end 块中,只是确保不为真(即“if 1=2 begin” - 这只会但是,如果脚本不包含任何 GO 语句(因为这些语句指示新批次),则可以工作
使用顶部的 return 语句(同样,受批次分隔符限制)
使用基于连接的方法,这将确保整个脚本不执行(整个连接更准确) - 使用类似 '设置解析打开' 或 'SET NOEXEC ON' 位于脚本顶部。这将确保连接中的所有语句(或直到关闭所述 set 语句)都不会执行,而只会被解析/编译。
使用注释块注释掉整个脚本(即 /* 和 */)
编辑:演示 'return ' 语句是特定于批次的 - 请注意,您将在返回后继续看到结果集:
No, there isn't one - you have a couple of options:
Wrap the whole script in a big if/end block that is simply ensured to not be true (i.e. "if 1=2 begin" - this will only work however if the script doesn't include any GO statements (as those indicate a new batch)
Use the return statement at the top (again, limited by the batch separators)
Use a connection based approach, which will ensure non-execution for the entire script (entire connection to be more accurate) - use something like a 'SET PARSEONLY ON' or 'SET NOEXEC ON' at the top of the script. This will ensure all statements in the connection (or until said set statement is turned off) will not execute and will instead be parsed/compiled only.
Use a comment block to comment out the entire script (i.e. /* and */)
EDIT: Demonstration that the 'return' statement is batch specific - note that you will continue to see result-sets after the returns:
为什么不简单地将以下内容添加到脚本的开头
Why not simply add the following to the beginning of the script
要解决 RETURN/GO 问题,您可以将
RAISERROR ('Oi! Stop!', 20, 1) WITH LOG
放在顶部。这将按照 MSDN 上的 RAISERROR 关闭客户端连接。
最大的缺点是您必须是系统管理员才能使用严重性 20。
编辑:
一个简单的演示来反驳 Jersey Dude 的评论...
To work around the RETURN/GO issue you could put
RAISERROR ('Oi! Stop!', 20, 1) WITH LOG
at the top.This will close the client connection as per RAISERROR on MSDN.
The very big downside is you have to be sysadmin to use severity 20.
Edit:
A simple demonstration to counter Jersey Dude's comment...
严重性为 20 的 RAISERROR 将在事件查看器中报告为错误。
您可以使用 SET PARSEONLY ON; (或 NOEXEC)。在脚本末尾使用 GO SET PARSEONLY OFF;
RAISERROR with severity 20 will report as error in Event Viewer.
You can use SET PARSEONLY ON; (or NOEXEC). At the end of script use GO SET PARSEONLY OFF;
这是一种有点笨拙的方法,通过使用“全局”变量来处理 GO 批次。
这里与每个 GO-batch 的事务和 try/catch 块使用相同的想法。您可以尝试更改各种条件和/或让它生成错误(除以 0,请参阅注释)以测试其行为:
Here is a somewhat kludgy way to do it that works with GO-batches, by using a "global" variable.
And here is the same idea used with a transaction and a try/catch block for each GO-batch. You can try to change the various conditions and/or let it generate an error (divide by 0, see comments) to test how it behaves:
尝试将其作为 TSQL 脚本运行
返回结束执行。
RETURN (Transact-SQL)
Try running this as a TSQL Script
The return ends the execution.
RETURN (Transact-SQL)
尽管它的描述非常明确和有力,但 RETURN 在存储过程中对我来说不起作用(跳过进一步的执行)。我必须修改条件逻辑。发生在 SQL 2008、2008 R2 上:
必须更改为:
由于查找重复行而发现。调试 PRINT 确认 @idSess 在 IF 检查中的值大于零 - RETURN 没有中断执行!
Despite its very explicit and forceful description, RETURN did not work for me inside a stored procedure (to skip further execution). I had to modify the condition logic. Happens on both SQL 2008, 2008 R2:
had to be changed into:
Discovered as a result of finding duplicated rows. Debugging PRINTs confirmed that @idSess had value greater than zero in the IF check - RETURN did not break execution!
我知道这个问题很老了,并且以几种不同的方式得到了正确的回答,但没有像我在类似情况下使用过的答案。
第一种方法(非常基本):
第二种方法:
您可以自己轻松测试它,以确保它的行为符合预期。
I know the question is old and was answered correctly in few different ways but there is no answer as mine which I have used in similar situations.
First approach (very basic):
Second approach:
You can test it easily by yourself to make sure it behave as expected.
当你想停止执行时,只需使用 SET NOEXEC ON 即可。
just use SET NOEXEC ON when you want to stop execution.