用于远程查询执行的提供程序属性
如果提供程序支持的SQL 功能没有包含在 DBPROP_SQLSUPPORT 报告的语法级别中,可以通过使用各种提供程序特有的属性来指出它们。
- SQLPROP_GROUPBY。该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指出提供程序在 SELECT 语句中支持 GROUP BY 和 HAVING 子句。另外,它还指出提供程序支持如下五种聚合函数:MIN、MAX、SUM、COUNT 和 avg。提供程序可能不支持在这些合计函数参数中使用 DISTINCT。
- SQLPROP_SUBQUERIES。该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指出该提供程序支持SQL-92 entry 级别所规定的子查询。包括 SELECT 列表中的子查询,以及 WHERE 子句中的关系子查询,IN、EXISTS、ALL 和 ANY 运算符。
- SQLPROP_DATELITERALS。该属性对任何提供程序(包括支持SQL-92 entry 级别的提供程序)都比较有意义。对日期时间文字的标准语法的支持不属于SQL-92 entry 级别。该sql server 特有的属性指出提供程序支持SQL-92 标准所规定的日期时间文字语法。
- SQLPROP_ANSILIKE。该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指出提供程序支持每个SQL-92 entry 级别所规定的 LIKE 运算符(使用 "%" 和 "_" 作为通配符)。由于SQL-Minimum 级别没有包括对 LIKE 的支持,所以它对支持SQL-Minimum 级别的提供程序非常有用。
- SQLPROP_INNERJOIN。该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指出支持在 FROM 子句中使用多个表。由于SQL-Minimum 级别不支持联接,所以它对只支持SQL-Minimum 级别的提供程序非常有用。但是,这并非指出了对显式 JOIN 关键字和 OUT 联接的支持。它只指出了支持在 FROM 子句使用多个表的隐含联接。
- SQLPROP_DYNAMICSQL。该属性指出支持使用 "?" 作为参数标记。应支持参数标记在 WHERE 子句或 SELECT 列表中替代一个数量项目。对 "?" 运算符标记的支持允许SQL Server 向提供程序发送带参数查询。
- SQLPROP_NESTEDQUERIES。该属性指出支持在 FROM 子句中嵌套 SELECT(例如,SELECT * FROM (SELECT * FROM T))。在多种情况下,SQL Server 在生成远程执行的查询字符串时,在查询的 FROM 子句中使用嵌套的 SELECT 语句。由于对嵌套 SELECT 的支持并不是SQL-92 entry 级别所必需的,除非提供程序也设置了本属性,否则SQL Server 不会向提供程序委派带有嵌套 SELECT 语句的查询。另外,系统管理员也可以设置提供程序的 Nested Queries 选项,以使SQL Server 生成用于提供程序上的嵌套查询。
提供程序能够通过使用名为SQLPROPSET_OPTHINTS 的SQL Server 特殊属性集来支持这些属性,并获得已定义的 PROPID 值。属性集SQLPROPSET_OPTHINTS 和这两个属性通过使用以下常数来定义:
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支持在列级别上指定字符数据的排序。排序包括非 Unicode 字符数据(char 和 varchar 列)的字符集和排序顺序规范。对于Unicode数据(nchar 和 nvarchar 列),排序只指定了排序顺序。
只有在链接服务器使用的字符集(非 Unicode 数据)、排序顺序、字符串比较语法和本地服务器一致时,SQL Server 2000 才将字符串比较操作委派给提供程序。
在链接服务器是SQL Server时,SQL Server自动确定排序的兼容性。对于其他提供程序,系统管理员必须为SQL Server 指出给定的链接服务器上的字符数据的排序方式。在SQL Server 2000中,支持名为Collation Name的新的链接服务器选项。如果系统管理员确定链接服务器上采用的排序语法和SQL Server 标准语法一致,就能将Collation Name选项设置为排序名。Collation Name选项能够使用系统存储过程sp_serveroption 来设置。只有满足了如下两个条件时才应该设置该选项:
- 远程排序顺序和字符集与指定的SQL Server 排序一致。
- OLE DB 提供程序使用的字符串比较的语法符合SQL-92 标准规范或等同于SQL Server 的比较语法。
为了向下兼容,仍支持SQL Server 7.0 中的 Collation Compatible 选项。将其设置为true 等于将 Collation Name 选项设置为SQL Server 主数据库的默认排序方式。新的应用程序应使用 Collation Name 选项,而不是 Collation Compatible 选项。
索引访问
SQL Server 使用提供程序列出的索引来执行分布式查询的某些谓词。该方案只能在用户设置提供程序选项Index as access Path时才能用于索引提供程序。下面是在使用索引执行查询时SQL Server 在提供程序上运行的主要高级步骤:
- 通过使用完整的表名和索引名调用 IOpenRowset::OpenRowset 来打开索引行集。完整表名和索引名依据前面的远程查询方案中所述的方式生成。
- 通过使用完整表名调用 IOpenRowset::OpenRowset 来打开基本表行集。
- 通过调用 IRowsetIndex::SetRange 根据查询谓词设置索引行集的范围。
- 通过索引行集上的 IRowset 扫描索引行集的行。
- 使用检索到的索引行中的书签列来通过 IRowsetLocate::GetRowsByBookmark 从基本表行集中获取相应的行。
在基本表上打开行集时,行集属性 DBPROP_IRowsetLocate 和 DBPROP_BOOKMARKS 是必需的。
单纯表扫描
SQL Server 扫描提供程序的整个远程表并在本地运行所有的查询命令。通过调用IOpenRowset::OpenRowset 打开表中相应的行集。SQL Server使用目录、架构和对象名部分按以下方式来构造提供给 OPENROWSET 的表名:
- 每一个名称段都使用提供程序的引用字符 (DBLITERAL_QUOTE) 引用,然后使用 DBLITERAL_CATALOG_SEPARATOR 字符连接它们。
- 行集对象打开后,SQL Server 使用 IColumnsInfo 接口来验证该表运行时元数据是否和编译时的元数据一致。
- 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 取决于执行的操作是 UPDATE 还是 DELETE。
以下是在提供程序上运行 UPDATE 或 DELETE 操作的高级步骤:
- SQL Server 通过 IOpe