預設結果集處理和多個使用中結果集

提交要執行的要求時,Microsoft SQL Server 2005 會以下列方法將結果集送回用戶端:

  1. SQL Server 會從包含 Transact-SQL 陳述式或 Transact-SQL 陳述式批次的用戶端,接收要執行的網路封包。
  2. SQL Server 會編譯並執行陳述式或批次。
  3. SQL Server 會開始將結果集的資料列或批次或預存程序中的多個結果集放置到網路封包,然後將網路封包傳送到用戶端。SQL Server 會在每個封包中儘可能放置許多的結果集資料列。
  4. 包含結果集資料列的封包,會被快取 (Cache) 置入用戶端的網路緩衝區 (network Buffer) 中。一旦用戶端應用程式提取資料列時,ODBC 驅動程式或 OLE DB 提供者會提取網路緩衝區中的資料列,並將資料傳輸至用戶端應用程式。用戶端以順向一次擷取一個結果集資料列。

這個傳回結果的模式也就是預設結果集。

SQL Server 2005 會提供在單一連接中擁有多個使用中結果集的能力,這個能力通常稱為 MARS。必須對每個連接明確啟用這個功能。這項功能只能在 SQL Native Client ODBC 驅動程式、SQL Native Client OLEDB 提供者和 .NET Framework 2.0 SqlClient Managed 提供者中使用。

可以使用連接字串屬性或工作階段屬性來啟用特定工作階段的 MARS:

  • 若是 ODBC,SQL_COPT_SS_MARS_ENABLED 應該設為 SQL_MARS_ENABLED_YES
  • 若是 OLEDB,SSPROP_INIT_MARSCONNECTION 應該設為 VARIANT_TRUE
  • 若是 SqlClient Managed 提供者,連接字串屬性 MultipleActiveResultSets 必須設為 true。

MARS 只能用於連接到 SQL Server 2005 的用戶端提供者。MARS 無法用在舊版用戶端提供者或 SQL Server 的組合中。

在舊版 SQL Server 或未啟用 MARS 的工作階段中,在應用程式已處理 SQL Server 傳回的所有資料列,或傳送取消其餘結果的要求給 SQL Server 之前,用戶端無法在特定連接上傳送任何要求。處理所有結果之前,連接上無法執行任何更新動作。

ms187602.note(zh-tw,SQL.90).gif附註:
「救火資料指標」是預設結果集的淘汰用語。

預設結果集是處理 SQL Server 的結果集類型,會在沒有要求任何資料指標時使用。符合下列條件時會發生上述情形:

  • 應用程式未使用 DECLARE CURSOR 陳述式要求 Transact-SQL 伺服器資料指標。應用程式反而會直接執行 Transact-SQL 陳述式,例如 SELECT。
  • 應用程式使用 ADO、OLE DB 和 ODBC 時,它讓所有的 API 資料指標屬性均保持為預設值,所以沒有任何 API 資料指標被要求。此種預設屬性集將要求順向 (ForwardOnly)、資料列集為 1 的唯讀資料指標。
  • 由於當所有資料指標屬性設為其預設值,且所處理的資料指標與 SQL Server 或資料庫 API 實際上無關時會使用此處理類型,因此稱之為預設結果集。

不會以大型區塊的形式將預設結果集提供給應用程式。會在用戶端上的網路緩衝區中快取結果集。應用程式會透過結果集一次提取一個資料列。每一次提取時,OLE DB 提供者或 ODBC 驅動程式會將資料從網路緩衝區的下一個資料列移到應用程式中的變數。OLE DB、ODBC 和 ADO 應用程式會使用相同的 API 函數,擷取要用於提取資料指標之資料列的資料列。SqlClient Managed 提供者會使用 SqlDataReader 類別公開預設結果集。當 MultipleActiveResultSets 設為 true 時,表示在提供的時間中將允許開啟多個 SqlDataReader。

預設結果集是將結果傳輸至用戶端的最有效方式。從用戶端電腦傳送至伺服端的唯一封包,即為攜帶所要執行陳述式的原始封包。結果傳回用戶端時,SQL Server 會儘量將多個結果集資料列放入各個封包中,以期將傳送給用戶端的封包數減至最少。

使用預設結果集時,會支援所有的 Transact-SQL 陳述式。使用預設結果集時,您也可以執行包含多個傳回結果集陳述式的批次或預存程序。

預設結果集的唯一用途是將結果集傳回給用戶端應用程式。預設結果集中的資料無法供其他 Transact-SQL 陳述式,或批次、預存程序、觸發程序中的變數使用。例如,請考慮下列預存程序或觸發程序中的陳述式:

SELECT ProductID FROM AdventureWorks.Production.Product;

陳述式產生的預設結果集中包含 AdventureWorks 資料庫中所有產品的識別碼,而 SQL Server 會直接將預設結果集傳送到用戶端。預存程序或觸發程序中沒有其他 Transact-SQL 陳述式或變數可以參考這個產品識別碼清單。若是其他 Transact-SQL 陳述式在此結果集中使用的資料,則必須在 Transact-SQL 伺服器資料指標中:

DECLARE abc CURSOR FOR
SELECT ProductID FROM AdventureWorks.Production.Product;

請參閱

其他資源

Rowsets and SQL Server Cursors
Using SQL Server Default Result Sets

說明及資訊

取得 SQL Server 2005 協助