批处理
新增信息 - SQL Server 2000 SP3。批处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到 Microsoft® SQL Server™ 执行。SQL Server 将批处理语句编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。编译错误(如语法错误)使执行计划无法编译,从而导致批处理中的任何语句均无法执行。运行时错误(如算术溢出或违反约束)会产生以下两种影响之一: 大多数运行时错误将停止执行批处理中当前语句和它之后的语句。
少数运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其它所有语句。
在遇到运行时错误之前执行的语句不受影响。唯一的例外是如果批处理在事务中而且错误导致事务回滚。在这种情况下,回滚运行时错误之前所进行的未提交的数据修改。假定在批处理中有 10 条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果编译了批处理,而第二条语句在执行时失败,则第一条语句的结果不受影响,因为它已经执行。以下规则适用于批处理: CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其它语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其它语句将被解释为第一个 CREATE 语句定义的一部分。
不能在同一个批处理中更改表,然后引用新列。
如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。
安全说明 批处理文件可能包含以纯文本存储的凭据。在批处理执行期间,凭据可能会回显到用户屏幕上。
新增信息 - SQL Server 2000 SP3。批处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到 Microsoft® SQL Server™ 执行。SQL Server 将批处理语句编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。编译错误(如语法错误)使执行计划无法编译,从而导致批处理中的任何语句均无法执行。运行时错误(如算术溢出或违反约束)会产生以下两种影响之一: 大多数运行时错误将停止执行批处理中当前语句和它之后的语句。
少数运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其它所有语句。
在遇到运行时错误之前执行的语句不受影响。唯一的例外是如果批处理在事务中而且错误导致事务回滚。在这种情况下,回滚运行时错误之前所进行的未提交的数据修改。假定在批处理中有 10 条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果编译了批处理,而第二条语句在执行时失败,则第一条语句的结果不受影响,因为它已经执行。以下规则适用于批处理: CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其它语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其它语句将被解释为第一个 CREATE 语句定义的一部分。
不能在同一个批处理中更改表,然后引用新列。
如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。
安全说明 批处理文件可能包含以纯文本存储的凭据。在批处理执行期间,凭据可能会回显到用户屏幕上。
以下示例是使用 SQL 查询分析器和 osql 实用工具的 GO 命令定义批处理边界的脚本。下例创建一个视图。因为 CREATE VIEW 必须是批处理中的唯一语句,所以需要 GO 命令将 CREATE VIEW 语句与其周围的 USE 和 SELECT 语句隔离。USE pubs
GO /* Signals the end of the batch */CREATE VIEW auth_titles
AS
SELECT *
FROM authors
GO /* Signals the end of the batch */SELECT *
FROM auth_titles
GO /* Signals the end of the batch */下例说明将几个批处理组合成一个事务。BEGIN TRANSACTION 和 COMMIT 语句分隔事务边界。BEGIN TRANSACTION、USE、CREATE TABLE、SELECT 和 COMMIT 语句都包含在它们各自的单语句批处理中。所有的 INSERT 语句包含在一个批处理中。BEGIN TRANSACTION
GO
USE pubs
GO
CREATE TABLE mycompanies
(
id_num int IDENTITY(100, 5),
company_name nvarchar(100)
)
GO
INSERT mycompanies (company_name)
VALUES ('New Moon Books')
INSERT mycompanies (company_name)
VALUES ('Binnet & Hardley')
INSERT mycompanies (company_name)
VALUES ('Algodata Infosystems')
INSERT mycompanies (company_name)
VALUES ('Five Lakes Publishing')
INSERT mycompanies (company_name)
VALUES ('Ramona Publishers')
INSERT mycompanies (company_name)
VALUES ('GGG&G')
INSERT mycompanies (company_name)
VALUES ('Scootney Books')
INSERT mycompanies (company_name)
VALUES ('Lucerne Publishing')
GO
SELECT *
FROM mycompanies
ORDER BY company_name ASC
GO
COMMIT
GO下列脚本说明两个问题。首先,变量 @MyVar 在第二个批处理中定义而在第三个批处理中引用。而且第二个批处理中有注释的开始但没有结尾。第三个批处理有注释的结尾,但是当 osql 读取 GO 命令时,它将第一个批处理发送到 Microsoft® SQL Server™,由于"/*"没有与之匹配的"*/"而产生语法错误。USE Northwind
GO
DECLARE @MyVar INT
/* Start of the split comment.
GO
End of the split comment. */
SELECT @MyVar = 29
GO