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 陳述式:

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

    如果資料來源不支援參數陣列,則驅動程式可為每個參數集執行一次 SQL 陳述式,藉此進行模擬。 如需詳細資訊,請參閱本節稍後所述的陳述式參數參數值陣列

不同的批次型別不可以互通方式混用。 也就是說,應用程式判斷執行包含程序呼叫的明確批次、使用參數陣列的明確批次,以及使用參數陣列的程序呼叫結果的方式,需視驅動程式而定。

此章節包含下列主題。