SQL Server 在 Transact-SQL 字符串中使用问号 (?) 作为参数标记的带参数查询命令。带参数查询命令可以用于 SQL Server、Microsoft Jet 和 Oracle OLE DB 提供程序。对于其他提供程序,如果该提供程序支持 Command 对象的 ICommandWithParameters 属性,并且至少满足如下条件之一,则也可以使用带参数查询命令:
- 提供程序通过 DBPROP_SQLSUPPORT 属性指出支持 SQL Server 的 ODBC Core 级别。
- 通过使用 IDBPProperties 支持 SQL Server 特有的属性 SQLPROP_DYNCMICSQL,提供程序指出对问号 (?) 参数标记的支持。有关详细信息,请参阅下一节“提供程序属性”。
- 系统管理员通过设置提供程序上的选项 Dynamic Parameters 来使 SQL Server 生成带参数查询。
当 SQL Server 生成在远程执行的 SQL 文本时,表名和列名被提供程序的引用字符(IDBInfo 接口的 DBLITERAL_QUOTE 文字)引起来。如果不支持该文字,则表名和列名不会被引起来。
如果提供程序支持带参数查询执行,SQL Server 将带参数查询执行策略视为执行一个远程表和本地表的联接。带参数查询根据由本地表中每一行生成的参数值重复执行。这种策略减少了从提供程序获取的行数,并且有利于行数较少的本地表联接到行数较多的远程表。远程联接策略可以使用 REMOTE 联接优化提示来强制执行。有关带参数查询执行的详细信息,请参阅 SQL Server Books Online。
下面是在远程查询方案中针对提供程序所进行的高级步骤:
- SQL Server 使用 IDBCreateCommand::CreateCommand 从 Session 对象创建 Command 对象。
- 如果将服务器配置选项 Remote Query Timeout 的值设置为大于零,SQL Server 将使用 ICommandProperties::SetProperties 把 Command 对象的 DBPROP_COMMANDTIMEOUT 设置为同样的值;必须调用 ICommand::SetCommandText 来将命令文本设置为已生成的 Transact-SQL 字符串。
- SQL Server 调用 ICommandPrepare::Prepare 来准备命令。如果提供程序不支持该接口,SQL Server 将继续第 4 步。
- 如果生成的查询是带参数的,SQL Server 使用 ICommandWithParameters::SetParameterInfo 来描述这些参数并使用 IAccessor::CreateAccessor 创建使用这些参数的访问器。
- SQL Server 调用 ICommand::Execute 来执行命令并创建行集。
- SQL Server 使用 IRowset 接口浏览并使用表中的行。使用 IRowset::GetNextRows 获取行,使用 IRowset::RestartPosition 来重定位行集的起始点,使用 IRowset::ReleaseRows 释放行。
用于远程查询执行的提供程序属性
如果提供程序支持的 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 生成用于提供程序上的嵌套查询。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] 下一页