SQL Server中怎样进行批处理,方法是什么
Admin 2022-08-02 群英技术资讯 351 次浏览
批处理是作为一个逻辑单元的T-SQL语句。如果一条语句不能通过语法分析,那么不会运行任何语句。如果一条语句在运行时失败,那么产生错误的语句之前的语句都已经运行了。
为了将一个脚本分为多个批处理,可使用GO语句。
GO语句的特点:
GO命令应当自成一行。在技术上,可以在GO命令之后的同一行开始一个新的批处理,但是这会严重影响可读性。T-SQL语句不能放在GO语句之前,否则GO语句经常会被错误地理解,从而造成语法分析错误或产生一些不可预料的后果。例如,在WHERE子句之后使用一个GO语句。
SELECT * FROM Person WHERE Id = 100 GO
分析器就不知道如何处理。
消息 102,级别 15,状态 1,第 1 行 'GO' 附近有语法错误。
因为每个批处理被单独地处理,所以一个批处理中的错误不会阻止另一个批处理运行。要说明这点,请看一下下面的代码。
SELECT 1/0 GO SELECT 0/1
如果这些批处理之间没有任何依赖性,则每个批处理在运行时是完全自治的。
消息 8134,级别 16,状态 1,第 1 行 遇到以零作除数错误。 (1 行受影响)
如果这些批处理之间存在依赖性,那么错误发生之后的每个批处理都会失败。依赖性指的是后面的语句,依赖前面执行的结果或变量等等。
一个常见的错误是认为GO是T-SQL命令,其实GO是一个只能被编辑工具(Management Studio)识别的命令。
当编辑工具遇到GO语句时,会将GO语句看做一个终止批处理的标记,将其打包,并且作为一个独立的单元发送到服务器,不包括GO。因为服务器本身根本不知道GO是什么意思。
批处理中的错误分为以下两类:
如果查询分析器发现一个语法错误,那么批处理的处理过程会被立即取消。因为语法检查发生在批处理编译或者执行之前,所以在语法检查期间的一个失败意味着还没有批处理被执行-不管语法错误发生在批处理中的什么位置。
运行时错误的工作方式有很大不同,因为任何在遇到运行时错误之前执行的语句已经完成了,所以除非是未提交事务的一部分,否则这些语句所做的任何事情都已经是现实了。
一般而言,运行时错误将终止从错误发生的地方到此批处理末端的批处理的执行。下一个批处理不影响。
使用批处理有若干个理由,但是所有的批处理都有一个共同点-当脚本中的一些事情必须发生在另外一件事情之前或者分开发生时,需要使用批处理。
有一些命令必须有他们自己的批处理。
如果想在单个脚本中将这些语句中的任意一个和其他语句进行组合,那么需要通过使用GO语句将他们分散到各自的批处理中。
当需要建立优先权时,就可能用到批处理。也就是说,在下一个任务开始之前,需要全部完成上一个任务。在大多数时候,SQL Server可以很好地处理这种情况 - 脚本中的第一条语句是首先执行的,并且脚本中的第二条语句可以依赖第二条语句运行时服务器所处的适当状态。
下面来看一个例子:
USE master CREATE DATABASE Test CREATE TABLE TestTable ( col1 int, col2 int )
当执行上面的脚本,提示命令已成功完成。但是真的没问题吗?
当查看Test数据库时,发现表TestTable并不存在,反而master数据库里多了一个TestTable表。
为什么表被创建在了master数据库中,答案取决于当运行CREATE TABLE语句时,当前数据库是什么。在这个例子中,它恰好是master数据库,所以表就创建在该数据库中。
你可能以为将上述代码改成这样可能就能够解决:
CREATE DATABASE Test USE Test CREATE TABLE TestTable ( col1 int, col2 int )
但很遗憾,并不能,错误信息如下:
消息 911,级别 16,状态 1,第 3 行 数据库 'Test' 不存在。请确保正确地输入了该名称。
分析器尝试验证代码时,发现USE引用一个不存在的数据库,这是批处理语句不可或缺,正确的代码如下:
CREATE DATABASE Test GO --此GO是两主角 USE Test CREATE TABLE TestTable ( col1 int, col2 int )
就这样加了一个GO之后,问题成功解决。
下面再来看一个例子:
USE Test ALTER TABLE TestTable ADD col3 int INSERT INTO TestTable (col1,col2,col3) VALUES (1,1,1)
以上代码在查询分析器中提示col3列不存在。实际上,以上代码也可以通过一个GO解决。
USE Test ALTER TABLE TestTable ADD col3 int GO --先更改数据库,然发送插入,此时就是分开进行语法验证了 INSERT INTO TestTable (col1,col2,col3) VALUES (1,1,1)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
SQL DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。有不少朋友对此感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
这篇文章介绍了SQL Server实现查询每个分组的前N条记录,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
SQL LEN() 函数返回文本字段中值的长度,有不少朋友对于SQL LEN函数比较感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
Microsoft SQL Server 事物日志中每个记录都由一个唯一的日志序列号(LSN)标识,如果 LSN2 大于 LSN1,则 LSN2 所标识的日志记录描述的更改发生在日志记录 LSN1 描述的更改之后。
SQL UNION运算符用于组合两个或更多SELECT语句的结果集,而不返回任何重复的行。UNION中的每个SELECT语句必须具有相同的列数,这些列也必须具有相似的数据类型,每个SELECT语句中的列也必须以相同的顺序排列,每个SELECT语句必须有相同数目的列表达式 但是每个SELECT语句的长度不必相同
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008