SQL 语句的批处理

一批 SQL 语句是指由两个或多个 SQL 语句组成的一组 SQL 语句,或者效果与这一组 SQL 语句相同的单个 SQL 语句。 在某些实现中,先执行整批语句,然后再得到结果。 这种做法通常比单独提交语句更有效率,因为网络流量往往会减少,而数据源有时可以优化一批 SQL 语句的执行效果。 在另一些实现中,调用 SQLMoreResults 会触发该批次中下一个语句的执行。 ODBC 支持以下类型的批处理:

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

    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 语句来模拟这些参数。 有关详细信息,请参见本部分后面的语句参数参数值数组

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

本部分包含以下主题。