在應用程式提交 SQL 語句之後,SQL Server 會以一或多個結果集傳回任何產生的數據。 結果集是一組符合查詢準則的數據列和數據行。 SELECT 語句、目錄函式和某些預存程式會產生一個結果集,以表格式形式提供給應用程式使用。 如果執行的 SQL 語句是預存程式、包含多個命令的批次,或包含關鍵詞的 SELECT 語句,將會有多個結果集要處理。
ODBC 目錄函式也可以擷取數據。 例如, SQLColumns 會擷取數據源中數據行的相關數據。 這些結果集可以包含零個或多個數據列。
其他 SQL 語句,例如 GRANT 或 REVOKE,不會傳回結果集。 針對這些語句, 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
列印
RAISERROR
SQL Server Native Client ODBC 驅動程式會在 11 或更新版本的 RAISERROR 上傳回SQL_ERROR。 如果 RAISERROR 的嚴重性為 19 或更高版本,也會卸除連線。
若要從 SQL 語句處理結果集,應用程式:
決定結果集的特性。
將數據行系結至程式變數。
擷取單一值、整個值列或多個值數據列。
測試以查看是否有更多結果集,如果是,則會回傳以判斷新結果集的特性。
從數據源擷取數據列並將其傳回至應用程式的程式稱為擷取。