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 陳述式來模擬。 欲了解更多資訊,請參閱本文後面的「 語句參數參數值陣列」。

不同類型的批次無法以互通的方式混合使用。 也就是說,應用程式如何判斷執行包含程序呼叫的明確批次、使用參數陣列的明確批次,以及使用參數陣列的程序呼叫之結果,取決於驅動程式的特性。