考虑下面的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中存在一些可以满足特定条件的干净地退出脚本的脚本。退出实际上是指退出,而不是简单地打破当前正在评估的条件。
答案 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 错误的错误消息,这些错误依赖于早先批次中创建的数据库结构(如果不是)。不会被跳过。