處理結果 (ODBC)
應用程式提交 SQL 陳述式後,SQL Server 會傳回產生的任何資料,做為一或多個結果集。結果集是一組符合查詢準則的資料列和資料行。SELECT 陳述式、目錄函數以及某些預存程序會產生表格形式的結果集,供應用程式使用。如果已執行的 SQL 陳述式是一個預存程序、包含多個命令的批次,或包含關鍵字 (COMPUTE 或 COMPUTE BY) 的 SELECT 陳述式,則會有多個要處理的結果集。
ODBC 目錄函數也可以擷取資料。例如,SQLColumns 會擷取資料來源中,關於資料行的資料。這些結果集可以包含零或多個資料列。
GRANT 或 REVOKE 之類的 SQL 陳述式不會傳回結果集。對於這些陳述式,SQLExecute 或 SQLExecDirect 中的傳回碼通常是指出陳述式成功的唯一指標。
每個 INSERT、UPDATE 和 DELETE 陳述式都會傳回只包含受到修改影響之資料列數目的結果集。當應用程式呼叫 SQLRowCount 時,就會提供這個計數。ODBC 3.x 應用程式必須呼叫 SQLRowCount 來擷取結果集,或呼叫 SQLMoreResults 來取消它。當應用程式執行包含多個 INSERT、UPDATE 或 DELETE 陳述式的批次或預存程序時,每個修改陳述式中的結果集都必須使用 SQLRowCount 處理,或使用 SQLMoreResults 取消。在批次或預存程序中加入 SET NOCOUNT ON 陳述式可以取消這些計數。
Transact-SQL 包括 SET NOCOUNT 陳述式。NOCOUNT 選項設定為開啟時,SQL Server 不會傳回受到陳述式影響的資料列計數,而且 SQLRowCount 會傳回 0。SQL Server Native Client ODBC 驅動程式版本導入一個驅動程式專屬的 SQLGetStmtAttr 選項 SQL_SOPT_SS_NOCOUNT_STATUS,來回報 NOCOUNT 選項開啟或關閉。SQLRowCount 傳回 0 時,應用程式應該測試 SQL_SOPT_SS_NOCOUNT_STATUS。如果傳回 SQL_NC_ON,SQLRowCount 的值為 0 時,只表示 SQL Server 尚未傳回資料列計數。如果傳回 SQL_NC_OFF,表示 NOCOUNT 是關閉的,而 SQLRowCount 的值為 0 時,表示陳述式沒有影響任何資料列。當 SQL_SOPT_SS_NOCOUNT_STATUS 為 SQL_NC_OFF 時,應用程式不應該顯示 SQLRowCount 的值。大型批次或預存程序可能包含多個 SET NOCOUNT 陳述式,因此,程式設計人員無法假設 SQL_SOPT_SS_NOCOUNT_STATUS 仍為常數。每次 SQLRowCount 傳回 0 時,應該測試此選項。
其他數個 Transact-SQL 陳述式會在訊息 (而非結果集) 中傳回其資料。當 SQL Server Native Client ODBC 驅動程式收到這些訊息時,它會傳回 SQL_SUCCESS_WITH_INFO,讓應用程式知道有參考用訊息。接著,應用程式可以呼叫 SQLGetDiagRec 來擷取這些訊息。使用此種方式運作的 Transact-SQL 陳述式為:
DBCC
SET SHOWPLAN (適用於舊版的 SQL Server)
SET STATISTICS
PRINT
RAISERROR
SQL Server Native Client ODBC 驅動程式會針對嚴重性為 11 以上的 RAISERROR 傳回 SQL_ERROR。如果 RAISERROR 的嚴重性為 19 以上,也會中斷連接。
若要從 SQL 陳述式處理結果集,應用程式會:
決定結果集的特性。
將資料行繫結到程式變數。
擷取單一值、整個資料列的值,或多個資料列的值。
測試是否有其他結果集,如果有,回到決定新結果集的特性。
從資料來源擷取資料列,然後將其傳回應用程式的過程稱為提取。
擷取 COMPUTE 和 COMPUTE BY 結果集
COMPUTE BY 子句會在資料集內產生小計,而 COMPUTE 子句則會在結果集的結尾產生總計。SQL Server Native Client ODBC 驅動程式會針對每個 SELECT 陳述式產生多個結果集,以便為呼叫的應用程式呈現這些總計和小計。
下列範例使用 COMPUTE BY 產生小計,並使用 COMPUTE 產生總計:
SELECT Title = CONVERT(char(20), title), type, price, advance
FROM Titles
WHERE ytd_sales IS NOT NULL
AND type LIKE '%cook%'
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)
這些陳述式可以針對平均價格計算小計,並針對每種書籍類型加總預付款,然後加總價格與預付款資料的最後總計。此驅動程式會從具有第一種書籍類型的書籍,呈現資料列的第一個結果集。接著,它會針對這個第一組書籍的 AVG(價格) 和 SUM(預付款),產生包含兩個 COMPUTE BY 資料行的另一個結果集。然後,它會針對下一群組的書籍產生第三個結果集,並針對該群組產生包含 COMPUTE BY 小計的第四個結果集。此驅動程式會交錯這些結果集,直到針對 COMPUTE SUM(價格)、SUM(預付款) 子句產生包含總計的最終結果集為止。