用于遠程查詢執(zhí)行的提供程序?qū)傩?/strong>
如果提供程序支持的SQL 功能沒有包含在 DBPROP_SQLSUPPORT 報告的語法級別中,可以通過使用各種提供程序特有的屬性來指出它們。
- SQLPROP_GROUPBY。該屬性對支持SQL-Minimum 級別的提供程序比較有意義。它指出提供程序在 SELECT 語句中支持 GROUP BY 和 HAVING 子句。另外,它還指出提供程序支持如下五種聚合函數(shù):MIN、MAX、SUM、COUNT 和 AVG。提供程序可能不支持在這些合計函數(shù)參數(shù)中使用 DISTINCT。
- SQLPROP_SUBQUERIES。該屬性對支持SQL-Minimum 級別的提供程序比較有意義。它指出該提供程序支持SQL-92 entry 級別所規(guī)定的子查詢。包括 SELECT 列表中的子查詢,以及 WHERE 子句中的關系子查詢,IN、EXISTS、ALL 和 ANY 運算符。
- SQLPROP_DATELITERALS。該屬性對任何提供程序(包括支持SQL-92 entry 級別的提供程序)都比較有意義。對日期時間文字的標準語法的支持不屬于SQL-92 entry 級別。該SQL Server 特有的屬性指出提供程序支持SQL-92 標準所規(guī)定的日期時間文字語法。
- SQLPROP_ANSILIKE。該屬性對支持SQL-Minimum 級別的提供程序比較有意義。它指出提供程序支持每個SQL-92 entry 級別所規(guī)定的 LIKE 運算符(使用 "%" 和 "_" 作為通配符)。由于SQL-Minimum 級別沒有包括對 LIKE 的支持,所以它對支持SQL-Minimum 級別的提供程序非常有用。
- SQLPROP_INNERJOIN。該屬性對支持SQL-Minimum 級別的提供程序比較有意義。它指出支持在 FROM 子句中使用多個表。由于SQL-Minimum 級別不支持聯(lián)接,所以它對只支持SQL-Minimum 級別的提供程序非常有用。但是,這并非指出了對顯式 JOIN 關鍵字和 OUT 聯(lián)接的支持。它只指出了支持在 FROM 子句使用多個表的隱含聯(lián)接。
- SQLPROP_DYNAMICSQL。該屬性指出支持使用 "?" 作為參數(shù)標記。應支持參數(shù)標記在 WHERE 子句或 SELECT 列表中替代一個數(shù)量項目。對 "?" 運算符標記的支持允許SQL Server 向提供程序發(fā)送帶參數(shù)查詢。
- SQLPROP_NESTEDQUERIES。該屬性指出支持在 FROM 子句中嵌套 SELECT(例如,SELECT * FROM (SELECT * FROM T))。在多種情況下,SQL Server 在生成遠程執(zhí)行的查詢字符串時,在查詢的 FROM 子句中使用嵌套的 SELECT 語句。由于對嵌套 SELECT 的支持并不是SQL-92 entry 級別所必需的,除非提供程序也設置了本屬性,否則SQL Server 不會向提供程序委派帶有嵌套 SELECT 語句的查詢。另外,系統(tǒng)管理員也可以設置提供程序的 Nested Queries 選項,以使SQL Server 生成用于提供程序上的嵌套查詢。
提供程序能夠通過使用名為SQLPROPSET_OPTHINTS 的SQL Server 特殊屬性集來支持這些屬性,并獲得已定義的 PROPID 值。屬性集SQLPROPSET_OPTHINTS 和這兩個屬性通過使用以下常數(shù)來定義:
extern const GUIDSQLPROPSET_OPTHINTS = { 0x2344480c, 0x33a7, 0x11d1,
{ 0x9b, 0x1a, 0x0, 0x60, 0x8, 0x26, 0x8b, 0x9e } };
enumSQLPROPERTIES {
SQLPROP_NESTEDQUERIES = 0x4,
SQLPROP_DYNAMICSQL = 0x5,
SQLPROP_GROUPBY = 0x6,
SQLPROP_DATELITERALS = 0x7,
SQLPROP_ANSILIKE = 0x8,
SQLPROP_INNERJOIN = 0x9,
SQLPROP_SUBQUERIES = 0x10
};
隱含的字符集和排序順序
SQL Server 2000支持在列級別上指定字符數(shù)據(jù)的排序。排序包括非 Unicode 字符數(shù)據(jù)(char 和 varchar 列)的字符集和排序順序規(guī)范。對于Unicode數(shù)據(jù)(nchar 和 nvarchar 列),排序只指定了排序順序。
只有在鏈接服務器使用的字符集(非 Unicode 數(shù)據(jù))、排序順序、字符串比較語法和本地服務器一致時,SQL Server 2000 才將字符串比較操作委派給提供程序。
在鏈接服務器是SQL Server時,SQL Server自動確定排序的兼容性。對于其他提供程序,系統(tǒng)管理員必須為SQL Server 指出給定的鏈接服務器上的字符數(shù)據(jù)的排序方式。在SQL Server 2000中,支持名為Collation Name的新的鏈接服務器選項。如果系統(tǒng)管理員確定鏈接服務器上采用的排序語法和SQL Server 標準語法一致,就能將Collation Name選項設置為排序名。Collation Name選項能夠使用系統(tǒng)存儲過程sp_serveroption 來設置。只有滿足了如下兩個條件時才應該設置該選項:
- 遠程排序順序和字符集與指定的SQL Server 排序一致。
- OLE DB 提供程序使用的字符串比較的語法符合SQL-92 標準規(guī)范或等同于SQL Server 的比較語法。
為了向下兼容,仍支持SQL Server 7.0 中的 Collation Compatible 選項。將其設置為true 等于將 Collation Name 選項設置為SQL Server 主數(shù)據(jù)庫的默認排序方式。新的應用程序應使用 Collation Name 選項,而不是 Collation Compatible 選項。
索引訪問
SQL Server 使用提供程序列出的索引來執(zhí)行分布式查詢的某些謂詞。該方案只能在用戶設置提供程序選項Index as Access Path時才能用于索引提供程序。下面是在使用索引執(zhí)行查詢時SQL Server 在提供程序上運行的主要高級步驟:
- 通過使用完整的表名和索引名調(diào)用 IOpenRowset::OpenRowset 來打開索引行集。完整表名和索引名依據(jù)前面的遠程查詢方案中所述的方式生成。
- 通過使用完整表名調(diào)用 IOpenRowset::OpenRowset 來打開基本表行集。
- 通過調(diào)用 IRowsetIndex::SetRange 根據(jù)查詢謂詞設置索引行集的范圍。
- 通過索引行集上的 IRowset 掃描索引行集的行。
- 使用檢索到的索引行中的書簽列來通過 IRowsetLocate::GetRowsByBookmark 從基本表行集中獲取相應的行。
在基本表上打開行集時,行集屬性 DBPROP_IRowsetLocate 和 DBPROP_BOOKMARKS 是必需的。
單純表掃描
SQL Server 掃描提供程序的整個遠程表并在本地運行所有的查詢命令。通過調(diào)用IOpenRowset::OpenRowset 打開表中相應的行集。SQL Server使用目錄、架構(gòu)和對象名部分按以下方式來構(gòu)造提供給 OPENROWSET 的表名:
- 每一個名稱段都使用提供程序的引用字符 (DBLITERAL_QUOTE) 引用,然后使用 DBLITERAL_CATALOG_SEPARATOR 字符連接它們。
- 行集對象打開后,SQL Server 使用 IColumnsInfo 接口來驗證該表運行時元數(shù)據(jù)是否和編譯時的元數(shù)據(jù)一致。
- SQL Server 使用 IRowset 接口瀏覽并使用表中的行。使用 IRowset::GetNextRows 獲取行,使用 IRowset::RestartPosition 來重定位行集的起始點,使用 IRowset::ReleaseRows 釋放行。
UPDATE和DELETE語句
要從SQL Server 分布式查詢中對遠程表進行更新和刪除,必須滿足如下條件:
- 提供程序必須支持在被更新或刪除的表上使用 IOpenRowset 打開的行集的書簽。
- 提供程序必須支持在被更新或刪除的表上使用 IOpenRowset 打開的行集合上的 IRowsetLocate 和 IRowsetChange 接口。
- IRowsetChange 接口必須支持更新 (SetData) 和刪除 (DeleteRows) 方法。
- 如果提供程序不支持 ITransactionLocal,則僅在該提供程序設置了 Non-transacted 選項且語句不在用戶事務中時,才允許使用 UPDATE/DELETE 語句。
- 如果提供程序不支持 ITransactionJoin,只有不在用戶事務中時才允許 UPDATE/DELETE 語句。
下列行集屬性是在被更新的表中打開的行集所必需的:DBPROP_IRowsetLocate、DBPROP_IRowsetChange 和 DBPROP_BOOKMARKS。將DBPROP_UPDATABILITY 行集屬性設置為 DBPROPVAL_UP_CHANGE 還是 DBPROPVAL_UP_DELETE 取決于執(zhí)行的操作是 UPDATE 還是 DELETE。
以下是在提供程序上運行 UPDATE 或 DELETE 操作的高級步驟:
- SQL Server 通過 IOpe
關鍵詞標簽:連接,查詢,SQL,提供,程