IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫MSSQL → SQL Server 分布式查詢:OLE DB連接(三)

SQL Server 分布式查詢:OLE DB連接(三)

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

用于遠(yuǎn)程查詢執(zhí)行的提供程序?qū)傩?/strong>

如果提供程序支持的SQL 功能沒有包含在 DBPROP_SQLSUPPORT 報(bào)告的語法級(jí)別中,可以通過使用各種提供程序特有的屬性來指出它們。

  • SQLPROP_GROUPBY。該屬性對(duì)支持SQL-Minimum 級(jí)別的提供程序比較有意義。它指出提供程序在 SELECT 語句中支持 GROUP BY 和 HAVING 子句。另外,它還指出提供程序支持如下五種聚合函數(shù):MIN、MAX、SUM、COUNT 和 AVG。提供程序可能不支持在這些合計(jì)函數(shù)參數(shù)中使用 DISTINCT。

  • SQLPROP_SUBQUERIES。該屬性對(duì)支持SQL-Minimum 級(jí)別的提供程序比較有意義。它指出該提供程序支持SQL-92 entry 級(jí)別所規(guī)定的子查詢。包括 SELECT 列表中的子查詢,以及 WHERE 子句中的關(guān)系子查詢,IN、EXISTS、ALL 和 ANY 運(yùn)算符。

  • SQLPROP_DATELITERALS。該屬性對(duì)任何提供程序(包括支持SQL-92 entry 級(jí)別的提供程序)都比較有意義。對(duì)日期時(shí)間文字的標(biāo)準(zhǔn)語法的支持不屬于SQL-92 entry 級(jí)別。該SQL Server 特有的屬性指出提供程序支持SQL-92 標(biāo)準(zhǔn)所規(guī)定的日期時(shí)間文字語法。

  • SQLPROP_ANSILIKE。該屬性對(duì)支持SQL-Minimum 級(jí)別的提供程序比較有意義。它指出提供程序支持每個(gè)SQL-92 entry 級(jí)別所規(guī)定的 LIKE 運(yùn)算符(使用 "%" 和 "_" 作為通配符)。由于SQL-Minimum 級(jí)別沒有包括對(duì) LIKE 的支持,所以它對(duì)支持SQL-Minimum 級(jí)別的提供程序非常有用。

  • SQLPROP_INNERJOIN。該屬性對(duì)支持SQL-Minimum 級(jí)別的提供程序比較有意義。它指出支持在 FROM 子句中使用多個(gè)表。由于SQL-Minimum 級(jí)別不支持聯(lián)接,所以它對(duì)只支持SQL-Minimum 級(jí)別的提供程序非常有用。但是,這并非指出了對(duì)顯式 JOIN 關(guān)鍵字和 OUT 聯(lián)接的支持。它只指出了支持在 FROM 子句使用多個(gè)表的隱含聯(lián)接。

  • SQLPROP_DYNAMICSQL。該屬性指出支持使用 "?" 作為參數(shù)標(biāo)記。應(yīng)支持參數(shù)標(biāo)記在 WHERE 子句或 SELECT 列表中替代一個(gè)數(shù)量項(xiàng)目。對(duì) "?" 運(yùn)算符標(biāo)記的支持允許SQL Server 向提供程序發(fā)送帶參數(shù)查詢。

  • SQLPROP_NESTEDQUERIES。該屬性指出支持在 FROM 子句中嵌套 SELECT(例如,SELECT * FROM (SELECT * FROM T))。在多種情況下,SQL Server 在生成遠(yuǎn)程執(zhí)行的查詢字符串時(shí),在查詢的 FROM 子句中使用嵌套的 SELECT 語句。由于對(duì)嵌套 SELECT 的支持并不是SQL-92 entry 級(jí)別所必需的,除非提供程序也設(shè)置了本屬性,否則SQL Server 不會(huì)向提供程序委派帶有嵌套 SELECT 語句的查詢。另外,系統(tǒng)管理員也可以設(shè)置提供程序的 Nested Queries 選項(xiàng),以使SQL Server 生成用于提供程序上的嵌套查詢。



提供程序能夠通過使用名為SQLPROPSET_OPTHINTS 的SQL Server 特殊屬性集來支持這些屬性,并獲得已定義的 PROPID 值。屬性集SQLPROPSET_OPTHINTS 和這兩個(gè)屬性通過使用以下常數(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支持在列級(jí)別上指定字符數(shù)據(jù)的排序。排序包括非 Unicode 字符數(shù)據(jù)(charvarchar 列)的字符集和排序順序規(guī)范。對(duì)于Unicode數(shù)據(jù)(ncharnvarchar 列),排序只指定了排序順序。

只有在鏈接服務(wù)器使用的字符集(非 Unicode 數(shù)據(jù))、排序順序、字符串比較語法和本地服務(wù)器一致時(shí),SQL Server 2000 才將字符串比較操作委派給提供程序。

在鏈接服務(wù)器是SQL Server時(shí),SQL Server自動(dòng)確定排序的兼容性。對(duì)于其他提供程序,系統(tǒng)管理員必須為SQL Server 指出給定的鏈接服務(wù)器上的字符數(shù)據(jù)的排序方式。在SQL Server 2000中,支持名為Collation Name的新的鏈接服務(wù)器選項(xiàng)。如果系統(tǒng)管理員確定鏈接服務(wù)器上采用的排序語法和SQL Server 標(biāo)準(zhǔn)語法一致,就能將Collation Name選項(xiàng)設(shè)置為排序名。Collation Name選項(xiàng)能夠使用系統(tǒng)存儲(chǔ)過程sp_serveroption 來設(shè)置。只有滿足了如下兩個(gè)條件時(shí)才應(yīng)該設(shè)置該選項(xiàng):

  • 遠(yuǎn)程排序順序和字符集與指定的SQL Server 排序一致。

  • OLE DB 提供程序使用的字符串比較的語法符合SQL-92 標(biāo)準(zhǔn)規(guī)范或等同于SQL Server 的比較語法。



為了向下兼容,仍支持SQL Server 7.0 中的 Collation Compatible 選項(xiàng)。將其設(shè)置為true 等于將 Collation Name 選項(xiàng)設(shè)置為SQL Server 主數(shù)據(jù)庫的默認(rèn)排序方式。新的應(yīng)用程序應(yīng)使用 Collation Name 選項(xiàng),而不是 Collation Compatible 選項(xiàng)。

索引訪問

SQL Server 使用提供程序列出的索引來執(zhí)行分布式查詢的某些謂詞。該方案只能在用戶設(shè)置提供程序選項(xiàng)Index as Access Path時(shí)才能用于索引提供程序。下面是在使用索引執(zhí)行查詢時(shí)SQL Server 在提供程序上運(yùn)行的主要高級(jí)步驟:

  1. 通過使用完整的表名和索引名調(diào)用 IOpenRowset::OpenRowset 來打開索引行集。完整表名和索引名依據(jù)前面的遠(yuǎn)程查詢方案中所述的方式生成。

  2. 通過使用完整表名調(diào)用 IOpenRowset::OpenRowset 來打開基本表行集。

  3. 通過調(diào)用 IRowsetIndex::SetRange 根據(jù)查詢謂詞設(shè)置索引行集的范圍。

  4. 通過索引行集上的 IRowset 掃描索引行集的行。

  5. 使用檢索到的索引行中的書簽列來通過 IRowsetLocate::GetRowsByBookmark 從基本表行集中獲取相應(yīng)的行。



在基本表上打開行集時(shí),行集屬性 DBPROP_IRowsetLocate 和 DBPROP_BOOKMARKS 是必需的。

單純表掃描

SQL Server 掃描提供程序的整個(gè)遠(yuǎn)程表并在本地運(yùn)行所有的查詢命令。通過調(diào)用IOpenRowset::OpenRowset 打開表中相應(yīng)的行集。SQL Server使用目錄、架構(gòu)和對(duì)象名部分按以下方式來構(gòu)造提供給 OPENROWSET 的表名:

  1. 每一個(gè)名稱段都使用提供程序的引用字符 (DBLITERAL_QUOTE) 引用,然后使用 DBLITERAL_CATALOG_SEPARATOR 字符連接它們。

  2. 行集對(duì)象打開后,SQL Server 使用 IColumnsInfo 接口來驗(yàn)證該表運(yùn)行時(shí)元數(shù)據(jù)是否和編譯時(shí)的元數(shù)據(jù)一致。

  3. SQL Server 使用 IRowset 接口瀏覽并使用表中的行。使用 IRowset::GetNextRows 獲取行,使用 IRowset::RestartPosition 來重定位行集的起始點(diǎn),使用 IRowset::ReleaseRows 釋放行。



UPDATE和DELETE語句

要從SQL Server 分布式查詢中對(duì)遠(yuǎn)程表進(jìn)行更新和刪除,必須滿足如下條件:

  • 提供程序必須支持在被更新或刪除的表上使用 IOpenRowset 打開的行集的書簽。

  • 提供程序必須支持在被更新或刪除的表上使用 IOpenRowset 打開的行集合上的 IRowsetLocateIRowsetChange 接口。

  • IRowsetChange 接口必須支持更新 (SetData) 和刪除 (DeleteRows) 方法。

  • 如果提供程序不支持 ITransactionLocal,則僅在該提供程序設(shè)置了 Non-transacted 選項(xiàng)且語句不在用戶事務(wù)中時(shí),才允許使用 UPDATE/DELETE 語句。

  • 如果提供程序不支持 ITransactionJoin,只有不在用戶事務(wù)中時(shí)才允許 UPDATE/DELETE 語句。



下列行集屬性是在被更新的表中打開的行集所必需的:DBPROP_IRowsetLocate、DBPROP_IRowsetChange 和 DBPROP_BOOKMARKS。將DBPROP_UPDATABILITY 行集屬性設(shè)置為 DBPROPVAL_UP_CHANGE 還是 DBPROPVAL_UP_DELETE 取決于執(zhí)行的操作是 UPDATE 還是 DELETE。

以下是在提供程序上運(yùn)行 UPDATE 或 DELETE 操作的高級(jí)步驟:

  1. SQL Server 通過 IOpe

    關(guān)鍵詞標(biāo)簽:連接,查詢,SQL,提供,程

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系

相關(guān)下載

    人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法