SQL Server Native Client 中的疏鬆資料行支援

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除。 不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 開發新的應用程式。 往後請改用新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新的 Microsoft ODBC Driver for SQL Server。 如需 SQL Server 資料庫引擎元件隨附的 SQLNCLI(版本 2012 到 2019),請參閱此 支援生命週期例外狀況

SQL Server Native Client 支援疏鬆資料行。 如需有關 SQL Server 中疏鬆資料行的詳細資訊,請參閱使用疏鬆資料行使用資料行集

如需 SQL Server Native Client 中疏鬆資料行支援的詳細資訊,請參閱 疏鬆資料行支援 (ODBC) 疏鬆資料行支援 (OLE DB)

疏鬆資料行和 SQL Server Native Client 的使用者案例

下表摘要說明 SQL Server Native Client 使用者具有疏鬆資料行的常見使用者案例:

狀況 行為
select * from table 或 IOpenRowset::OpenRowset. 傳回不屬於疏鬆 column_set 成員的所有資料行,加上包含屬於疏鬆 column_set 成員之所有非 Null 資料行值的 XML 資料行。
依名稱參考資料行。 不管其疏鬆資料行狀態或 column_set 成員資格,都可以參考資料行。
透過計算 XML 資料行,存取 column_set 成員資料行。 屬於疏鬆 column_set 成員的資料行可以透過依名稱選取 column_set 來存取,而且可以透過更新 column_set 資料行中的 XML 來插入和更新值。

這個值必須符合 column_set 資料行的結構描述。
透過具有 Null 或 '%' 的資料行搜尋模式,透過 SQLColumns 擷取資料表中所有資料行的中繼資料:或透過沒有資料行限制的DBSCHEMA_COLUMNS架構資料列集 (OLE DB)。 傳回不屬於疏鬆 column_set 成員之所有資料行的資料列。 如果資料表包含疏鬆 column_set,將會針對該資料表傳回一個資料列。

請注意,這不會針對屬於 column_set 成員的資料行傳回中繼資料。
不管 column_set 中的疏鬆度或成員資格,擷取所有資料行的中繼資料。 這可能會傳回非常大量的資料列。 將描述元欄位SQL_SOPT_SS_NAME_SCOPE設定為SQL_SS_NAME_SCOPE_EXTENDED並呼叫 SQLColumns (ODBC)。

針對DBSCHEMA_COLUMNS_EXTENDED架構資料列集 (OLE DB) 呼叫 IDBSchemaRowset::GetRowset。

此案例無法從比 SQL Server 2008 (10.0.x) 之前的版本使用 SQL Server Native Client 的應用程式。 不過,這類應用程式可以直接查詢系統檢視。
僅針對屬於 column_set 成員的資料行擷取中繼資料。 這可能會傳回非常大量的資料列。 將描述元欄位SQL_SOPT_SS_NAME_SCOPE設定為SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET並呼叫 SQLColumns (ODBC)。

針對DBSCHEMA_SPARSE_COLUMN_SET架構資料列集呼叫 IDBSchemaRowset::GetRowset。

此案例無法從比 SQL Server 2008 (10.0.x) 之前的版本使用 SQL Server Native Client 的應用程式。 不過,這類應用程式可以查詢系統檢視。
決定資料行是否為疏鬆。 請參閱 SQLColumns 結果集 (ODBC) 的SS_IS_SPARSE資料行。

查閱 DBSCHEMA_COLUMNS 結構描述資料列集 (OLE DB) 的 SS_IS_SPARSE 資料行。

此案例無法從比 SQL Server 2008 (10.0.x) 之前的版本使用 SQL Server Native Client 的應用程式。 不過,這類應用程式可以查詢系統檢視。
判斷資料行是否為 column_set 請參閱 SQLColumns 結果集SS_IS_COLUMN_SET資料行。 或者,請參閱 SQL Server 特定資料行屬性SQL_CA_SS_IS_COLUMN_SET (ODBC)。

查閱 DBSCHEMA_COLUMNS 結構描述資料列集的 SS_IS_COLUMN_SET 資料行。 或者,查閱 IColumnsRowset::GetColumnsRowset 所傳回的資料列集中 IColumnsinfo::GetColumnInfo 或 DBCOLUMNFLAGS 傳回的 dwFlags。 針對 column_set 資料行,將會設定DBCOLUMNFLAGS_SS_ISCOLUMNSET (OLE DB)。

此案例無法從比 SQL Server 2008 (10.0.x) 之前的版本使用 SQL Server Native Client 的應用程式。 不過,這類應用程式可以查詢系統檢視。
針對沒有 column_set 的資料表,依 BCP 匯入和匯出疏鬆資料行。 舊版 SQL Server Native Client 的行為沒有變更。
針對包含 column_set 的資料表,依 BCP 匯入和匯出疏鬆資料行。 column_set 的匯入和匯出方式與 XML 相同;也就是說,如果當作二進位類型繫結,如同 varbinary(max),或者,如果當作 charwchar 類型繫結,則如同 nvarchar(max)

屬於疏鬆 column_set 成員的資料行不會匯出為不同的資料行;它們只會在 column_set 的值中匯出。
BCP 的 queryout 行為。 從舊版 SQL Server Native Client 處理明確命名的資料行時,不會有任何變更。

與包含不同結構描述之資料表間匯入和匯出相關的案例可能需要特殊處理。

如需有關 BCP 的詳細資訊,請參閱本主題稍後的「疏鬆資料行的大量複製 (BCP) 支援」。

下層用戶端行為

下層用戶端僅會針對不屬於 SQLColumns 和 DBSCHMA_COLUMNS 之疏鬆 column_set 成員的資料行傳回中繼資料。 SQL Server 2008 (10.0.x) Native Client 中導入的其他 OLE DB 架構資料列集將無法使用,也不會透過 SQL_SOPT_SS_NAME_SCOPE 修改 ODBC 中的 SQLColumns。

下層用戶端可以依名稱存取屬於疏鬆 column_set 成員的資料行,而且 column_set 資料行將可以存取 SQL Server 2005 (9.x) 用戶端的 XML 資料行。

疏鬆資料行的大量複製 (BCP) 支援

針對疏鬆資料行或 column_set 功能,ODBC 或 OLE DB 中沒有任何 BCP API 的變更。

如果某個資料表包含 column_set,則不會將疏鬆資料行當作不同的資料行處理。 所有疏鬆資料行的值都包含在 column_set 的值中,其匯出方式與 XML 資料行相同,也就是說,如果當作二進位類型繫結,如同 varbinary(max),或者,如果當作 charwchar 類型繫結,則如同 nvarchar(max)。 匯入時,column_set 值必須符合 column_set 的結構描述。

針對 queryout 作業,不會變更處理明確參考之資料行的方式。 column_set 資料行的行為與 XML 資料行相同,而且疏鬆度對於具名疏鬆資料行的處理沒有作用。

不過,如果 queryout 用於匯出,而且您參考的疏鬆資料行屬於依名稱設定之疏鬆資料行集的成員,則您無法直接匯入結構類似的資料表。 這是因為 BCP 會在匯出時使用與 select * 作業一致的中繼資料,而且無法將 column_set 成員資料行與此中繼資料比對。 若要個別匯入 column_set 成員資料行,您必須在資料表上定義參考所需 column_set 資料行的檢視表,而且您必須使用檢視表執行匯入作業。

另請參閱

SQL Server Native Client 程式設計