是否有 SQL 等同于 return?

Is there a SQL equivalent of return?

考虑以下 SQL

    SET DATEFORMAT ymd
SET ARITHABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON
SET NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS, XACT_ABORT OFF
GO
USE master
GO

IF DB_NAME() <> N'master' SET NOEXEC ON

--
-- Create database [myDatabaseName]
--
PRINT (N'Create database [myDatabaseName]')
GO
CREATE DATABASE myDatabaseName

然后是一个很长的脚本来设置表、视图、存储过程等。

我想知道 SQL 是否允许类似以下伪代码的内容;

If (myDatabaseName Exists)
     Return  // in other word abort the script here but don't throw an error
Else
 //Carry on and install the database

我知道 SQL 中的 Exists 函数,但我似乎找不到任何可以直接中止脚本剩余部分的东西。

此脚本将在安装例程中结束。从理论上讲,它永远不应该出现在数据库已经存在的安装程序中,但是我宁愿不要冒险并为潜在的错误做好准备。同样重要的是脚本不会抛出任何错误,因为这只会导致安装程序回滚并且什么都不安装。

我希望 SQL 中存在某些东西,如果满足特定条件,它会干净地退出脚本。我所说的退出确实是指退出,而不是简单地打破当前正在评估的条件。

您可以按如下方式使用 GOTO :

If (myDatabaseName Exists)
     GOTO QUIT;  // in other word abort the script here but don't throw an error
Else
 //Carry on and install the database

QUIT:
  SELECT 0;

这种请求有几种方法:

raiserror('Oh no a fatal error', 20, -1) with log

print 'Fatal error, script will not continue!'
set noexec on

他们应该工作并关闭连接。

看这里:Answer

问题是,您的客户端工具(SSMS、SQLCMd 等)会根据 GO 关键字的位置将您的脚本分成多个批次(这是客户端工具的事情,而不是 SQL服务器)。

然后发送第一批。第一批完成后(无论结果如何),它会发送第二批,然后是第二批之后的第三批,依此类推

如果您有 运行 足够的权限,高值 RAISERROR(严重性 20-25)应该会停止客户端工具的运行(因为它会强制关闭连接)。不过 并不干净。

另一种选择是尝试设置 NOEXEC ON,它仍然对每个后续批次(编译)做一些工作,但不会 运行 任何代码 1。如果您希望最后的某些批次始终 运行,则可以通过再次将其 OFF 设置为更好的恢复选项。


1这意味着您仍然会看到 compilation 的错误消息,这些消息依赖于已创建的数据库结构在较早的批次中,如果它们没有被跳过。