SQL 语句的批处理

一批 SQL 语句是一组两个或更多个 SQL 语句,或一个 SQL 语句,其效果与两个或更多个 SQL 语句组相同。 在某些实现中,在提供任何结果之前,将执行整个批处理语句。 这通常比单独提交语句更有效,因为网络流量通常会减少,数据源有时可以优化一批 SQL 语句的执行。 在其他实现中,调用 SQLMoreResults 会触发批处理中的下一个语句的执行。 ODBC 支持以下类型的批处理:

  • 显式批处理显式批处理是由分号分隔的两个或多个 SQL 语句(;))。 例如,以下一批 SQL 语句将打开新的销售订单。 这需要将行插入“订单”和“行”表中。 请注意,最后一个语句之后没有分号。

    INSERT INTO Orders (OrderID, CustID, OpenDate, SalesPerson, Status)  
       VALUES (2002, 1001, {fn CURDATE()}, 'Garcia', 'OPEN');  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 1, 1234, 10);  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 2, 987, 8);  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 3, 566, 17);  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 4, 412, 500)  
    
  • 程序 如果某个过程包含多个 SQL 语句,则被视为一批 SQL 语句。 例如,以下特定于 SQL Server 的语句创建一个过程,该过程返回一个结果集,其中包含有关客户的信息和一个结果集,其中列出了该客户的所有开放式销售订单:

    CREATE PROCEDURE GetCustInfo (@CustomerID INT) AS  
       SELECT * FROM Customers WHERE CustID = @CustomerID  
       SELECT OrderID FROM Orders  
          WHERE CustID = @CustomerID AND Status = 'OPEN'  
    

    CREATE PROCEDURE 语句本身不是一批 SQL 语句。 但是,它创建的过程是一批 SQL 语句。 没有分号分隔这两个 SELECT 语句,因为 CREATE PROCEDURE 语句特定于 SQL Server,SQL Server 不需要分号来分隔 CREATE PROCEDURE 语句中的多个语句。

  • 参数数组 参数数组可与参数化 SQL 语句一起使用,作为执行批量作的有效方法。 例如,参数数组可以与以下 INSERT 语句一起使用,以便在仅执行单个 SQL 语句时将多行插入到 Lines 表中:

    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (?, ?, ?, ?)  
    

    如果数据源不支持参数数组,驱动程序可以通过为每个参数集执行一次 SQL 语句来模拟它们。 有关详细信息,请参阅本节后面的 语句参数参数值的数组

不同类型的批处理不能以可互作的方式混合。 也就是说,应用程序如何确定执行包含过程调用的显式批处理、使用参数数组的显式批处理以及使用参数数组的过程调用的结果特定于驱动程序。

本节包含以下主题。