SQL Server 中的稀疏列支援

iSQlServer發表於2008-12-17

SQL Server Native Client 支援稀疏列。有關 SQL Server 中的稀疏列的詳細資訊,請參閱使用稀疏列和使用列集。

有關 SQL Server Native Client 中的稀疏列支援的詳細資訊,請參閱稀疏列支援 (ODBC) 和稀疏列支援 (OLE DB)。

有關演示此功能的示例應用程式的資訊,請參閱安裝 SQL Server 示例和示例資料庫的注意事項。

 稀疏列和 SQL Server Native Client 的使用者應用場景
下表為具有稀疏列的 SQL Server Native Client 使用者總結了常見使用者應用場景:

應用場景  行為 
select * from table 或 IOpenRowset::OpenRowset。
 返回不是稀疏 column_set 的成員的所有列,以及包含是稀疏 column_set 的成員的所有非空列值的 XML 列。
 
按名稱引用列。
 可以不考慮其稀疏列狀態或 column_set 成員身份如何而引用列。
 
通過計算的 XML 列訪問 column_set 成員列。
 作為稀疏 column_set 的成員的列可以通過按名稱選擇 column_set 進行訪問,並且可通過在 column_set 列中更新 XML 插入和更新值。

該值必須符合針對 column_set 列的架構。
 
通過含有 NULL 或“%”(ODBC) 列搜尋模式的 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 的版本中的 SQL Server Native Client,則此應用場景不可行。但是,此類應用程式可以直接查詢系統檢視。
 
只為是 column_set 成員的列檢索後設資料。此操作可能返回大量的行。
 將描述符欄位 SQL_SOPT_SS_NAME_SCOPE 設定為 SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET 並且呼叫 SQLColumns (ODBC)。

為 DBSCHEMA_SPARSE_COLUMN_SET 架構行集 (OLE DB) 呼叫 IDBSchemaRowset::GetRowset。

如果應用程式使用來自早於 SQL Server 2008 的版本中的 SQL Server Native Client,則此應用場景不可行。但是,此類應用程式可以查詢系統檢視。
 
確定列是否為稀疏列。
 參考 SQLColumns 結果集 (ODBC) 的 SS_IS_SPARSE 列。

參考 DBSCHEMA_COLUMNS 架構行集 (OLE DB) 的 SS_IS_SPARSE 列。

如果應用程式使用來自早於 SQL Server 2008 的版本中的 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 列。或者,參考 IColumnsinfo::GetColumnInfo 返回的 dwFlags 或者 IColumnsRowset::GetColumnsRowset 返回的行集中的 DBCOLUMNFLAGS。對於 column_set 列,將設定 DBCOLUMNFLAGS_SS_ISCOLUMNSET (OLE DB)。

如果應用程式使用來自早於 SQL Server 2008 的版本中的 SQL Server Native Client,則此應用場景不可行。但是,此類應用程式可以查詢系統檢視。
 
為沒有 column_set 的表按 BCP 匯入和匯出稀疏列。
 在行為上與 SQL Server Native Client 的以前版本相比沒有變化。
 
為具有 column_set 的表按 BCP 匯入和匯出稀疏列。
 column_set 的匯入和匯出方式與 XML 相同;也就是說,與 varbinary(max) 相同(如果繫結為二進位制型別)或與 nvarchar(max) 相同(如果繫結為 char 或 wchar 型別)。

是稀疏 column_set 的成員的列不匯出為非重複列;它們只匯出在 column_set 的值中。
 
針對 BCP 的 queryout 行為。
 在處理顯式命名的列上與以前版本的 SQL Server Native Client 相比沒有變化。

如果應用場景涉及在具有不同架構的表之間進行匯入和匯出,則可能要求特殊處理。

有關 BCP 的詳細資訊,請參閱本章後面的“針對稀疏列的大容量複製 (BCP) 支援”。
 

 下級客戶端行為
下級客戶端將只為不屬於 SQLColumns 和 DBSCHMA_COLUMNS 的稀疏 column_set 的成員的列返回後設資料。在 SQL Server 2008 Native Client 中引入的附加 OLE DB 架構行集將不再提供,通過 SQL_SOPT_SS_NAME_SCOPE 在 ODBC 中對 SQLColumns 的修改也將不再提供。

下級客戶端將按名稱訪問作為稀疏 column_set 的成員的列,並且 column_set 列將可作為 SQL Server 2005 客戶端的 XML 列以及 SQL Server 2000 客戶端的 ntext 列訪問。

 針對稀疏列的大容量複製 (BCP) 支援
對於稀疏列或 column_set 功能,在 ODBC 或 OLE DB 中針對 BCP API 沒有任何變化。

如果某一表具有 column_set,則稀疏列不作為非重複列處理。所有稀疏列的值都包括在 column_set 的值中,後者採用與 XML 列相同的方式匯出;也就是說,與 varbinary(max) 相同(如果繫結為二進位制型別)或與 nvarchar(max) 相同(如果繫結為 char 或 wchar 型別)。在匯入時,column_set 值必須符合 column_set 的架構。

對於 queryout 操作,在處理顯式引用的列的方式上沒有變化。column_set 列具有與 XML 列相同的行為,並且稀疏性對於命名稀疏列的處理沒有影響。

但是,如果 queryout 用於匯出並且您引用的稀疏列屬於按名稱的稀疏列集的成員,則不能執行向類似結構表的直接匯入。這是因為 BCP 使用與 select * 操作一致的後設資料來用於匯入,並且無法將 column_set 成員列與此後設資料進行匹配。若要單獨匯入 column_set 成員列,您必須對引用所需 column_set 列的表定義一個檢視,並且必須使用該檢視執行匯入操作。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-512223/,如需轉載,請註明出處,否則將追究法律責任。

相關文章