批处理

批处理是同时从应用程序发送到 SQL Server 并得以执行的一组单条或多条 Transact-SQL 语句。SQL Server 将批处理的语句编译为单个可执行单元,称为执行计划。执行计划中的语句每次执行一条。

每个 Transact-SQL 语句应以分号结束。此要求不是强制性的,但不推荐使用允许语句不以分号结束的功能,Microsoft SQL Server 的未来版本可能会删除这种功能。

编译错误(如语法错误)可使执行计划无法编译。因此,不会执行批处理中的任何语句。

诸如算术溢出或约束冲突之类的运行时错误具有下面的影响:

  • 大多数运行时错误将停止执行批处理中当前语句和它之后的语句。

  • 某些运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其他所有语句。

在遇到运行时错误的语句之前执行的语句不受影响。唯一例外的情况是批处理位于事务中并且错误导致事务回滚。在这种情况下,所有在运行时错误之前执行的未提交数据修改都将回滚。

例如,假定批处理中有 10 条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果批处理经过编译,并且第二条语句在运行时失败,则第一条语句的结果不会受到影响,因为已执行了该语句。

SQL Server 提供了语句级重新编译功能。也就是说,如果一条语句触发了重新编译,则只重新编译该语句而不是整个批处理。此行为与 SQL Server 2000 不同。请考虑下面的示例,其中在同一批处理中包含一条 CREATE TABLE 语句和四条 INSERT 语句。

CREATE TABLE dbo.t3(a int) ;
INSERT INTO dbo.t3 VALUES (1) ;
INSERT INTO dbo.t3 VALUES (1,1) ;
INSERT INTO dbo.t3 VALUES (3) ;
GO

SELECT * FROM dbo.t3 ;

首先,对批处理进行编译。对 CREATE TABLE 语句进行编译,但由于表 dbo.t3 尚不存在,因此,未编译 INSERT 语句。

然后,批处理开始执行。表已创建。编译第一条 INSERT,然后立即执行。表现在具有一个行。然后,编译第二条 INSERT 语句。编译失败,批处理终止。SELECT 语句返回一个行。

在 SQL Server 2000 中,批处理开始执行,同时创建了表。逐一编译三条 INSERT 语句,但不执行。因为第二条 INSERT 语句导致一个编译错误,因此,整个批处理都将终止。SELECT 语句未返回任何行。

批处理使用规则

下面的规则适用于批处理的使用:

  • CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其他语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其他语句将被解释为第一个 CREATE 语句定义的一部分。

  • 不能在同一个批处理中更改表,然后引用新列。

  • 如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。

重要说明重要提示

批处理文件可能包含以纯文本格式存储的凭据。在批处理执行期间,凭据可能回显在用户屏幕上。