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 陳述式,藉此進行模擬。 如需詳細資訊,請參閱本節稍後所述的陳述式參數和參數值陣列。
不同的批次型別不可以互通方式混用。 也就是說,應用程式判斷執行包含程序呼叫的明確批次、使用參數陣列的明確批次,以及使用參數陣列的程序呼叫結果的方式,需視驅動程式而定。
此章節包含下列主題。