是否有SQL等价的return?

时间:2018-08-01 09:27:53

标签: sql sql-server-2017-express

考虑下面的SQL

'Insert into ' + TextBox.Text + ' Values(...)'

然后会有一个非常长的脚本来设置表,视图,存储过程等。

我想知道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中的Exists函数,但似乎找不到任何可以直接中止脚本其余部分的东西。

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

我希望SQL中存在一些可以满足特定条件的干净地退出脚本的脚本。退出实际上是指退出,而不是简单地打破当前正在评估的条件。

3 个答案:

答案 0 :(得分:0)

您可以按以下方式使用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;

答案 1 :(得分:0)

有几种方法可以处理这种请求:

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

OR

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

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

查看此处:Answer

答案 2 :(得分:0)

问题是,您的客户端工具(SSMS,SQLCMd等)会根据GO关键字的位置将脚本分为几批(这是客户端工具,根本不是SQL Server)。

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

如果您以足够的权限运行,那么高价值的RAISERROR(严重性20-25)应将客户端工具停止在其轨道中(因为它会强制关闭连接)。 不是

另一种选择是尝试设置NOEXEC ON,它仍然可以对以后的每个批处理(编译)进行一些操作,但不会运行任何代码 1 。如果您希望最后运行某些批次,请再次OFF将其恢复,这将为您提供一个更好的恢复选项。


1 这意味着对于以后的批次,您仍然会看到 compilation 错误的错误消息,这些错误依赖于早先批次中创建的数据库结构(如果不是)。不会被跳过。