代码之家  ›  专栏  ›  技术社区  ›  Dom Sinclair

是否有与return等价的SQL语句?

  •  0
  • Dom Sinclair  · 技术社区  · 8 年前

    考虑下面的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中存在的函数,但我似乎找不到任何简单的中止脚本剩余的任何方法。

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

    我希望SQL中存在一些可以在特定条件下干净地退出脚本的东西。通过退出,我真的意味着退出,而不是简单地打破目前正在评估的条件。

    3 回复  |  直到 7 年前
        1
  •  0
  •   Damien_The_Unbeliever    8 年前

    问题是,客户端工具(SSMS、SQLCMd等)根据 GO 关键字(这是一个客户端工具,根本不是SQL Server)。

    然后发送第一批。第一批完成后(无论 什么 结果),它发送第二批,然后是第二批之后的第三批,等等。

    如果运行时有足够的权限,则 RAISERROR (严重性为20-25)应停止跟踪客户端工具(因为它强制关闭连接)。不是的 那个 不过很干净。

    另一个选择是尝试设置 NOEXEC ON 它仍然可以处理每个后续批处理(编译),但不会运行任何代码 一 . 如果您希望在结束时始终运行某些批处理,可以通过将其 OFF 再一次。


    一 这意味着您仍然会看到 汇编 后面的批处理依赖于在前面的批处理中创建的数据库结构(如果不跳过的话)。

        2
  •  0
  •   Anupam Singh    8 年前

    您可以使用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;
    
        3
  •  0
  •   Cesar    8 年前

    这种请求有几种方法:

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

    或者

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

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

    请看这里: Answer

    推荐文章