批处理
  新增信息 - 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 关键字。 
安全说明  批处理文件可能包含以纯文本存储的凭据。在批处理执行期间,凭据可能会回显到用户屏幕上。

解决方案 »

  1.   

    批处理示例
    以下示例是使用 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