批处理

更新日期: 2005 年 12 月 5 日

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

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

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

  • 大多数运行时错误将停止执行批处理中当前语句和它之后的语句。
  • 某些运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其他所有语句。

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

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

SQL Server 2005 提供了语句级重新编译功能。也就是说,如果一条语句触发了重新编译,则只重新编译该语句而不是整个批处理。此行为与 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 关键字。
ms175502.note(zh-cn,SQL.90).gif重要提示:
批处理文件可能包含以纯文本格式存储的凭据。在批处理执行期间,凭据可能回显在用户屏幕上。

请参阅

概念

批处理执行环境和 MARS
指定批处理
批处理示例

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2005 年 12 月 5 日

新增内容:
  • 添加了有关语句级重新编译的信息。
  • 添加了安全说明。