这似乎是一个令人难以置信的愚蠢问题,但是如何让SQL Server Management Studio在遇到错误时停止处理SQL脚本?
我有一个很长的脚本,如果在开始时出现错误,SSMS报告它然后盲目地继续,更加搞砸了。我无法使用事务,因为脚本会创建多个数据库,但无法进入事务。数据库创建有时会失败。
SQL Server的Toad将在遇到的第一个错误时暂停,并询问您是要停止还是继续。这是我正在寻找的行为。它是否存在于SSMS中?
我不询问“我如何编写或修改脚本以便在出错时停止?”我没有兴趣修改我的脚本来实现这一点,我只是希望SSMS 停止出错。用于SQL Server的Toad 正是这样做,这就是我想要的行为。这也不是659188的重复,因为这与修改脚本以停止SSMS有关。
答案 0 :(得分:10)
简短的回答:你不能。
感谢提供解决方法的那些,但似乎SSMS本身不能像Toad for SQL Server那样设置为暂停或停止错误。
答案 1 :(得分:6)
ApexSQL Script以您想要的方式生成批处理脚本。举个例子:
--Script Header
begin transaction
go
{Statement #1}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
if @@trancount > 0 rollback transaction
set noexec on
end
go
{Statement #2}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
if @@trancount > 0 rollback transaction
set noexec on
end
go
--Script Footer
if @@trancount > 0 commit transaction
go
set noexec off
go
答案 2 :(得分:5)
考虑使用SQL Server附带的命令行程序'sqlcmd',并设置-b和-V选项。 -b将导致sqlcmd在遇到错误时退出。 -V控制被视为错误的严重性级别。
答案 3 :(得分:4)
您需要将SQL语句包装在 Transaction 中。
BEGIN TRANSACTION
/* run all your SQL statements */
COMMIT TRANSACTION
如果开始/结束事务中存在错误,则将回滚所有语句。
编辑:在开始/结束事务内部进行包装,将阻止语句被提交到数据库,但不会在此时停止它。您还需要将其包装在try / catch块中,如下所示:
BEGIN TRY
BEGIN TRANSACTION
/* run all your SQL statements */
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
答案 4 :(得分:4)
哇。那有点垃圾不是吗?我使用SQL-Workbench,就像Toad for SQL Server一样,可以轻松处理这个问题。与Toad for SQL Server不同,它是免费的。
我很惊讶这些基本功能不是标准工具的一部分。
答案 5 :(得分:2)
会在这里使用try catch块帮助。出错时,将退出try,在catch
中实现错误处理答案 6 :(得分:1)
11年后,SSMS仍然没有此功能...
但是!!您可以启用SQLCMD mode
(菜单/查询/ SQLCMD模式),然后在文本编辑器中定义此选项:
:ON ERROR EXIT
在您的t-sql脚本之前。现在,它将在出错时停止执行。
答案 7 :(得分:0)
如果您无法将脚本放入存储过程并使用return语句退出时出错,则@Justice提供的解决方案可能是您最好的选择。其他人都错过了这一点 - 即使你使用交易,甚至你也没有反复意见,你也无法从脚本返回。即使设置了xact abort,SSMS也会执行下一个操作。
如果您可以将脚本转换为存储过程,那么您可以在检测到错误时从它返回。
答案 8 :(得分:0)
这里提到了一些更多的解决方法:
SQL Server - stop or break execution of a SQL script
和
SQL Server: How to abort a series of batches in Query Analyzer?
(raiseerror 20 with log,set noexec on,sqlcmd mode:on error exit,等等)