sql serverver 复杂查询

在 Microsoftsql serverrver 2000 中分布式查询允许sql serverrver用户访问基于sql serverrver的服务器以外的数据(位于其他运行sql serverrver的服务器或是具有OLE DB接口的其他数据源中)。OLE DB提供了统一的方式来访问异类数据源中的列表数据 茬本文中,分布式查询是指任何引用了一个或多个外部OLE DB数据源中表或行集的SELECT、INSERT、UPDATE或DELETE语句 远程表是指存储于 OLE DB 数据源中并且不在执行查询的sql serverrver 所在服务器上的表。一个分布式查询可以访问一个或多个远程表

根据OLE DB提供程序在sql serverrver的分布式查询中的功能,我们将它们划分为如下类别根据定义,它们并非互相排斥;某种提供程序可能属于一个或多个类别:

  • 非SQL 命令提供程序

对象的提供程序都属于此类别。下面是 OLE DB 提供程序被sql serverrver 视为SQL 命令提供程序的必要条件:

  • 提供程序支持的SQL 语法必须至少是SQL 子集提供程序必须通过 DBPROP_SQLSUPPORT 属性来报告语法。

索引提供程序支持并提供與OLE DB对应的索引同时还允许基于索引对基本表执行查找。下面是 OLE DB 提供程序被sql serverrver 视为索引提供程序的必要条件:

  • 提供程序必须支持通过 IOpenRowset 打开索引中的行集(通过指定索引名和相应的基本表名称)
  • 对带索引基本表打开的行集(通过使用 IOpenRowset)必须支持 IRowsetLocate 接口,以便根据书签在行上定位

如果一个OLE DB提供程序满足以上条件,用户可以设置提供程序选项

以允许sql serverrver 使用提供程序的索引来执行查询。默认情况下除非该选项已被設置,否则sql serverrver 不会尝试使用提供程序的索引

sql serverrver支持多个影响sql serverrver访问OLE DB提供程序的方法的选项。可以使用sql serverrver 企业管理器中的“链接服务器属性”对话框来设置这些选项

接口来表现根据基本表打开行集的方式。这些提供程序既不是SQL 命令提供程序也不是索引提供程序;而是sql serverrver 分布式查询所能处理的提供程序中最简单的一类 对于此类提供程序,sql serverrver 仅能在分布式查询运行过程执行表扫描操作

非SQL 命令提供程序

如果提供程序支持所需的 OLE DB 接口,下列 Transact-SQL 语句类别都可以用于分布式查询

  • 除了将远程表作为目的表的 SELECT INTO 语句外,其他所有的 SELECT 语句都可以使用
  • 如果提供程序支持插入操作所需的接口,INSERT 语句可以用于远程表有关 INSERT 语句的 OLE DB 要求的详细信息,请查阅本文后面的INSERT语句
  • 如果提供程序满足 OLE DB 接口在特定表上的偠求,UPDATE 和 DELETE 语句也可以用于远程表有关更新或删除远程表时 OLE DB 接口必须满足的要求和条件,请参阅本文后面的UPDATE和DELETE
  • 如果提供程序支持所需的 OLE DB 功能,则分布式查询支持快照和键集两种游标分布式查询不支持动态游标。用户请求的分布式查询的动态游标将自动降级为键集游标 赽照游标在游标打开时被写入,而且结果集保持不变;对基本表的更新、插入和删除操作不会反映到游标中 键集游标在游标打开时被写叺,而且结果集在游标的整个生存期中保持不变但是,如果更新或删除基本表中的行当访问这些行时,能够在游标中看到变化如果對基本表的插入操作可能影响游标成员,则这种变化则是不可见的 如果提供程序满足更新和删除远程表的条件,则可以通过使用分布式查询中定义的游标以及对远程表的引用来更新和删除远程表例如:table UPDATE | DELETE WHERE CURRENT OF 。有关详细信息请参阅本文后面的UPDATE和DELETE 语句。 支持键集游标的要求 如果满足所有 Transact-SQL 语法的条件而且满足以下两种情况之一,那么在分布式查询中就支持键集游标:

    • 在查询中OLE DB 提供程序支持所有远程表上的可偅用书签。可重用书签可以从给定表的某个行集中隐去然后用于同一表中的其他行集上。对可重用书签的支持是通过 IDBSchemaRowset 的 TABLES_INFO 架构行集来指定嘚方法是将 BOOKMARK_DURABILITY 列设置为 BMK_DURABILITY_INTRANSACTION

    函数的分布式查询不支持键集游标。

    支持可更新键集游标的要求

    通过在分布式查询上定义的键集游标可以更新或刪除远程表,例如:UPDATE | DELETEWHERE CURRENT OF 下面是在分布式查询中允许使用可更新游标的条件:

    • 如果提供程序也满足对远程表进行更新和删除操作的条件,就尣许使用可更新游标有关详细信息,请参阅本文后面的UPDATE 和 DELETE 语句
    • 所有的可更新键集游标操作必须位于使用可复读或更高的隔离级别的用戶定义事务中。此外提供程序必须以 ITransactionJoin 接口支持分布式事务处理。
    OLE DB 提供程序交互阶段

    所有分布式查询的执行方案都有六种操作:

    • 建立连接囷检索属性操作指定sql serverrver 连接 OLE DB 提供程序的方法以及将用到提供程序的哪些属性。
    • 表名解析和检索元数据操作指定sql serverrver 将远程表名称(指定时使鼡两种方法之一:基于链接服务器的名称或特殊名称)解析为提供程序中相应数据对象的方法。这也包括sql serverrver 为编译和优化分布式查询从提供程序检索的表元数据
    • 事务管理操作,指定所有与 OLE DB 提供程序的事务相关的交互
    • 数据类型处理操作,该操作指定在执行分布式查询过程中当sql serverrver从OLE DB提供程序获得数据或向其导出数据时sql serverrver 处理 OLE DB 数据类型的方法。
    • 错误处理操作指定sql serverrver 使用从提供程序获得的扩展错误信息的方法。
    • 安全性操作指定sql serverrver 安全性和提供程序安全性的交互方式。
    • sql serverrver 使用 OPENROWSET 功能支持两种远程数据对象命名协议:基于链接服务器的四段式名称和特殊名称

      链接服务器是对OLE DB数据源的抽象。基于链接服务器的名称分为四段:...其中是链接服务器的名称。sql serverrver 将视为OLE DB提供程序和连接属性(用于向提供程序标识数据源)的来源其他三个名称段被OLE DB数据源解释为对特定远程表的标识。

      特殊名称是基于 OPENROWSET 或 OPENDATASOURCE 函数的名称它包括在分布式查询Φ每次引用远程表时的所有连接信息(包括所使用的 OLE DB 提供程序、用于标识数据源的属性、用户 ID 和密码)。 默认情况下只允许系统管理员使用特殊名称。要使用基于 OLE DB 提供程序的特殊名称应将提供程序的 DisallowAdhocAccess 选项设置为 0。 如果使用链接服务器名称sql serverrver 将在链接服务器定义中为 OLE DB 提供程序提取提供程序的名称和初始化属性。如果使用特殊名称sql serverrver 将从 OPENROWSET 函数的参数中提取相同的信息。 有关使用四段式名称建立链接服务器和基于特殊名称的语法的详细说明请参阅sql serverrver Books Online。

      以下是sql serverrver连接OLE DB提供程序时执行的高级步骤

      1. IDataInitialize 创建提供程序的 DSO 实例。这使服务组件管理器可以在提供程序的本地功能上集成其服务(例如回滚和支持更新)另外,通过 IDataInitialize 建立提供程序的实例还允许 OLE DB 服务组件为它们提供连接池这样可减尐连接和初始化的开销。

        在sql serverrver 的进程中还是在一个独立的进程中创建给定提供程序的实例可以根据需要进行配置。在独立的进程中创建实唎能够保护sql serverrver 进程免受提供程序故障的影响但同时还存在着与在sql serverrver 进程外组织 OLE DB 调用有关的性能开销。通过设置提供程序选项 Allow In Process可以将提供程序配置为进程内实例或进程外实例。有关设置提供程序选项的详细信息请参阅sql serverrver Books Online。 要学习更多有关 OLE DB 服务组件和建立会话池的知识请参阅提供程序的 OLE DB 文档。

      2. 如果在链接服务器定义或 OPENROWSET 函数的第二个参数中指定或隐含了下列属性则它们将被设置:


      3. sql serverrver 收集特定提供程序的信息。

        sql serverrver 将收集若干用于分布式查询执行中的提供程序属性;这些属性将通过调用IDBProperties::GetProperties 来检索这些属性全都是可选的;但是,对所有相关属性的支持将尣许sql serverrver 充分利用提供程序的功能例如,在确定sql serverrver 是否能够向提供程序发送查询时需要使用DBPROP_SQLSUPPORT。如果提供程序不支持该属性sql serverrver就不能将远程提供程序用作SQL命令提供程序,即使它是一个SQL命令提供程序在下表(表 1)中,“默认值”列列出了在提供程序不支持该属性时sql serverrver 所采用的值

      4. 鼡于确定 2.0 功能的可用性。
        用于确定提供程序的 NULL 连接行为是否与sql serverrver 一致
        确定提供程序是否支持大数据对象列的结构化存储接口。
        确定是否支歭同时打开一个以上的大对象列
        确定是否能够向提供程序发送SQL 查询。
        sql serverrver 特有的属性:如果返回 VARIANT_TRUE则指示参数标记 '?' 可以用于参数化查询执行。
        sql serverrver 属性:该属性对支持SQL-Minimum 级别的提供程序比较有意义它指示提供程序支持SQL-92 Entry 级别所规定的子查询。包括 SELECT 序列和 WHERE 子句中的子查询(支持相关子查询以及 IN、EXISTS、ALL 和 ANY 运算符)
        Ssql serverrver 特有的属性:该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指示支持在 FROM 子句中使用多表的联接

        作为默认的分隔符字符。如果提供程序只支持目录分隔符字符而不支持架构分隔符字符则sql serverrver 将把目录分隔符字符也作为架构分隔符字符使用。如果提供程序不支持 DBLITERAL_QUOTEsql serverrver 将使用单引号 (') 作为引用字符。

        如果提供程序的名称分隔符文字和这些默认值不匹配提供程序必须使用

        将它们公开,以便sql serverrver 通過四段式名称访问它的表如果没有将这些文字公开,那么对于这样的提供程序将只能使用传递查询

        sql serverrver 将分布式查询中给定的远程表名称解析为 OLE DB 数据源中的特定表或视图。基于链接服务器的和特殊的命名架构都将导致提供程序将名称解释为三段式名称在使用基于链接服务器的名称时,四段式名称的后三部分形成目录、架构和对象名在使用特殊名称时,OPENROWSET 函数的第三个参数指定了说明目录、架构和对象名的彡段式名称目录和架构名称中可以有一个为空值或全部为空值。(当目录名和架构名为空时四段式名称将变成:...。)在此情况下sql serverrver 搜索架构行集表时将使用 NULL 作为对应的值。 sql serverrver 使用的名称解析规则和元数据检索的步骤取决于提供程序是否支持

        接口返回的架构行集来寻找与特萣远程表名称部分匹配的架构行下面是与提供程序支持的架构行集限制有关的规则,以及sql serverrver 使用这些规则来检索远程表元数据的方法:

        • 提供程序必须全部支持对 TABLES 和 COLUMNS 中的 TABLE_SCHEMA 列的限制或者全部不支持。提供程序必须全部支持对 TABLES 和 COLUMNS 的目录名称限制或者全部不支持。
        • 如果支持 INDEXES 上的任何限制提供程序必须全部支持对 TABLES 和 INDEXES 的架构限制,或者全部不支持提供程序必须全部支持对 TABLES 和 INDEXES 行集的目录名限制,或者全部不支持

        鈳在指定的远程表上寻找索引。sql serverrver 从找到的索引条目中检索 TABLES_INFO 行集中sql serverrver 寻找有关指定远程表的附加信息(例如书签支持、书签类型和长度)。除了 TABLES_INFO 行集中的 DESCRIPTION 列以外所有的列都被使用。TABLES_INFO 行集中的信息按如下要求使用:

        并且远程表名称包含了目录或架构名则sql serverrver 将要求

        并返回一个错誤。但是如果既没有提供目录名,也没有提供架构名sql serverrver将打开对应于远程表的行集,并从行集对象的强制接口

        打开对应于表的行集提供OPENROWSET 的表名是由目录、架构和对象名等部分构成的。

        不支持TABLES、COLUMNS 和 TABLES_INFO行集sql serverrver将打开两次基本表上的行集:在查询编译时打开一次来检索元数据,茬查询运行时再打开一次由于打开行集而受影响的提供程序(例如,运行更改实时设备状态的代码发送电子邮件,运行任意用户提供嘚代码)必须注意这种行为

        如果提供程序支持基本表上的分布式统计,那么sql serverrver 2000将使用这些统计有两种统计可用于sql serverrver查询处理器:

        • 列(或元組)基数:它是在一个表的列(或一组列)中唯一值的数目。可用于依据列评估谓词的选择性支持分布式统计的提供程序必须支持至少┅种基数。
        • 柱状图:如果值的分布不均匀则唯一值的数目对于评估谓词的选择性是不够充分的。在此情况下提供一个柱状图即可就表Φ列值的分布提供更好的图形化信息。

        有了统计就能使sql serverrver查询优化程序更好地评估一个查询中的中间操作的基数这将使它生成更好的执行方案。

        OLE DB 提供程序应支持以下分布式统计:

        • 可选:可选地如果提供程序支持柱状图,它应支持 IOpenRowset::OpenRowset 方法的增强功能(允许通过指定相应统计的 DBID 來打开一个柱状图行集)
        • 子句谓词。查询优化程序使用约束信息来消除或简化因表中约束的存在而总为真或总为假的谓词 事务管理sql serverrver 通過使用提供程序的ITransactionLocal(用于本地事务)和ITransactionJoin(用于分布式事务)OLE DB 接口支持以事务方式访问分布式数据。通过启动提供程序的本地事务SQL Server可保证單元写操作。通过使用分布式事务sql serverrver可确保包括多个节点的事务在所有节点中都有同样的结果(无论是提交还是终止)。如果提供程序不支持必要的 OLE DB 事务相关接口根据本地事务的环境将不允许针对该提供程序进行更新操作。 下表(表2)描述了在用户执行分布式查询(给定叻提供程序的功能和本地事务的环境)时发生的事情针对提供程序的读操作是指一条 SELECT 语句,或者指远程表用在 SELECT INTO、INSERT、UPDATE 或 DELETE 语句的输入端的情形针对提供程序的写操作是指 INSERT、UPDATE 或 DELETE 语句,其中远程表作为目的表 表2:基于提供程序的功能和事务环境的分布式查询结果。
          在自身事务Φ(非用户事务) 默认情况下,只允许读操作如果启用提供程序级选项 Nontransacted Updates,则允许写操作(当启用该选项时,sql serverrver不能保证提供程序数据嘚原子性和一致性这将导致写操作的影响部分地反映到远程数据源中,而且无法撤消) 所有语句都允许在远程数据上运行。键集游标昰只读的
          本地事务在提供程序上以当前sql serverrver 会话隔离级别启动,然后在语句运行成功后提交(除非使用 SET TRANSACTION ISOLATION LEVEL 对sql serverrver 会话的隔离级别进行修改,否则默认级别是 READ COMMITTED提供程序必须支持请求的隔离级别。)
          允许所有语句键集游标是只读的。
          本地事务在提供程序上以当前sql serverrver 会话隔离级别启动然后在语句运行成功后提交。
          如果事务的隔离级别是READ COMMITTED(默认值)或更低则允许读操作。如果隔离级别更高将不允许分布式查询。 只尣许读操作新的分布式事务在提供程序上以当前sql serverrver 会话隔离级别启动。 新的分布式事务在提供程序上以当前sql serverrver 会话隔离级别启动然后在用戶事务提交时提交。对于修改数据的语句默认情况下,sql serverrver 将在分布式事务下启动一个嵌套的事务这样出现某种错误时就可以停止修改数據语句,而不必停止周围的事务如果 XACT_ABORT SET 选项为打开状态,sql serverrver 就不需要嵌套事务支持而且在修改数据的语句出错时可停止周围的事务。
          分布式查询中数据类型的处理OLE DB 提供程序按照由OLE DB 定义的数据类型(由 OLE DB 的 DBTYPE 指示)表明它们的数据sql serverrver 在服务器中以本地的sql serverrver 类型处理外部数据;不管数據是被sql serverrver 使用还是从sql serverrver 导出,这种处理方式都会产生从 OLE DB 数据类型到SQL Server 本地数据类型的映射(见表 3)或者从sql serverrver 本地数据类型到 OLE DB 数据类型的映射这种映射是以隐含方式实现的,除非另外注明 分布式查询中的数据类型使用下列两种映射方式之一进行处理:
          • 使用端映射,当远程表出现在 SELECT 語句中并位于 INSERT、UPDATE 和 DELETE 语句的输入端时该映射在使用端将类型从 OLE DB 数据类型映射为sql serverrver 本地数据类型。
          • 导出端映射当远程表作为 INSERT 或 UPDATE 语句的目的表絀现时,该映射在导出端将类型从sql serverrver 数据类型映射为 OLE DB 数据类型
          • * 表示如果sql serverrver 中没有确切的等价数据类型,则转换为某种形式的sql serverrver 类型这种转换將导致精确度降低、上溢或下溢。如果sql serverrver 的未来版本支持相应的数据类型则默认的隐式映射可能会改变。 注意: numeric(p,s)表示SQL Server的数据类型numeric精度为p刻度为 接口时,由DBCOLUMNINFO结构的wType和 dwFlags 成员代表这些信息 若要在包括特定的 DBTYPE 和 DBCOLUMNFLAG 值的给定列上用使用端映射,应在该表中寻找相应的sql serverrver 类型在表达式Φ远程表的列的类型规则可以通过如下的简单规则描述: 给定远程列的值在 Transact-SQL 表达式中是合法的条件为,它在上表中所映射的sql serverrver 类型在相同的仩下文中是合法的 表和规则定义:
            • 比较和表达式。通常如果是可用于X数据类型和 所映射数据类型上的有效运算符,则X 就是一个有效表達式
            • 显式转换。允许 Convert (X, ) 的条件: 的 DBTYPE 映射为本地数据类型 Y(如上表所示)而且允许从 Y 到 X 的显式转换
            如果用户要将远程数据转换为非默认本哋数据类型,则必须使用显示转换 若要在对远程表使用UPDATE 和 INSERT 语句时使用导出端映射,应使用同样的表将本地的sql serverrver 数据类型映射为OLE DB数据类型洳果下述情况之一存在,则允许将sql serverrver 类型 (S1) 映射为给定的OLE DB类型 (T):
            • 相应的映射可以在映射表(表3)中直接找到
            • 允许S1隐式转换为另一种sql serverrver类型S2,而S2對类型T的映射包含在映射表(表3)中
            • DB提供程序的LOB上列出完整的文本或图像功能。在OLE DB提供程序的大对象上不支持TEXTPTRS 的;因此也不支持相关嘚功能,例如TEXTPTR 系统函数以及 READTEXT、WRITETEXT 和 UPDATETEXT 语句。支持检索整个 LOB 列的 SELECT 语句也支持对远程表上整个大对象列的 UPDATE 和 INSERT 语句。 属性的值返回同样,提供程序应在 DBPROP_STRUCTUREDSTORAGE 属性中指出它所支持的接口 如果提供程序不支持LOB列上的任何结构化存储接口,sql serverrver 2000 将在自身实现该接口同时仍将它们按text、ntext或image列列絀。 访问 LOB 列如果提供程序支持结构化存储接口之一SQL Server在查询运行时按如下步骤检索LOB列: 读取LOB列使用被请求的结构化存储接口的接口指针(茬 IRowset::GetData 生成的行缓冲区中返回)来读取大对象列。如果提供程序不支持同时打开多个 LOB(即不支持 DBPROP_MULTIPLE_STORAGEOBJECTS)并且该行有多个大对象列时sql serverrver 将把 LOB 复制到本哋工作表中。 在LOB列上的UPDATE和INSERT 语句sql serverrver 通过向提供程序传递一个指向新的存储对象的指针来修改存储对象而不使用提供程序所提供的接口。对于烸个 LOB 列存储对象上被更新或插入的值是使用选定的结构化存储接口创建的。根据操作是 UPDATE 还是 INSERT指向存储对象的指针分别通过
              1. 如果接口支歭该错误对象,sql serverrver将调用GetErrorInfo函数来获得一个指向当前错误对象的IErrorInfo接口指针
              2. sql serverrver 使用IErrorRecords来循环查找对象中的所有错误记录并获得对应于每个记录的错誤信息文本。
              安全性当使用者连接到OLE DB提供程序时通常情况下,除非使用者希望作为集成安全用户被验证否则提供程序将需要用户 ID 和密碼。在分布式查询中sql serverrver 将作为 OLE DB 提供程序的使用者(代表执行分布式查询的sql serverrver 登录)。sql serverrver 将当前的SQL Server登录映射为链接服务器上的用户ID和密码 4.0或更早版本中,只有提供程序完全位于sql serverrver 机器中并且没有通过网络连接到后端数据源时才支持委派在这种情况下,Windows NT已验证的登录必须映射为特萣的用户ID和密码才能访问链接服务器 在确定了用于连接的安全上下文后,OLE DB提供程序将全面负责安全上下文的验证以及对数据源中数据对潒的权限检查 查询执行方案 执行分布式查询时,sql serverrver与OLE DB提供程序进行交互有下述一个或多个方案: 远程查询 sql serverrver 生成一个SQL查询它将计算出由提供程序完整执行的初始查询的一部分。该方案只能用于SQL 命令提供程序sql serverrver 通过生成SQL 查询将操作转给提供程序的程度取决于提供程序支持的SQL语法。提供程序应通过如下方式指出它的SQL 支持级别:
                BY的SELECT语句有关sql serverrver 用来为各语法级别的提供程序生成远程查询的SQL 语法的子集的详细信息。
              1. 通過支持各种sql serverrver特有的属性来指出对个别SQL功能的支持这些SQL功能没有包括在DBPROP_SQLSUPPORT报告的语法级别中。在本节后面描述了属性列表和sql serverrver使用它们的方法
              2. ICommandWithParameters属性,并且至少满足如下条件之一则也可以使用带参数查询命令: 当sql serverrver生成在远程执行的SQL文本时,表名和列名被提供程序的引用字符(IDBInfo接口的 DBLITERAL_QUOTE 文字)引起来如果不支持该文字,则表名和列名不会被引起来 如果提供程序支持带参数查询执行,sql serverrver将带参数查询执行策略视为執行一个远程表和本地表的联接带参数查询根据由本地表中每一行生成的参数值重复执行。这种策略减少了从提供程序获取的行数并苴有利于行数较少的本地表联接到行数较多的远程表。远程联接策略可以使用 REMOTE 联接优化提示来强制执行 下面是在远程查询方案中针对提供程序所进行的高级步骤:
                  来将命令文本设置为已生成的 Transact-SQL 字符串。
                用于远程查询执行的提供程序属性如果提供程序支持的SQL 功能没有包含在 DBPROP_SQLSUPPORT 報告的语法级别中可以通过使用各种提供程序特有的属性来指出它们。
                • SQLPROP_GROUPBY该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指出提供程序在 SELECT 語句中支持 GROUP BY 和 HAVING 子句另外,它还指出提供程序支持如下五种聚合函数:MIN、MAX、SUM、COUNT 和 AVG提供程序可能不支持在这些合计函数参数中使用 DISTINCT。
                • SQLPROP_DATELITERALS该屬性对任何提供程序(包括支持SQL-92 entry 级别的提供程序)都比较有意义。对日期时间文字的标准语法的支持不属于SQL-92 entry 级别该sql serverrver 特有的属性指出提供程序支持SQL-92 标准所规定的日期时间文字语法。
                • SQLPROP_INNERJOIN该属性对支持SQL-Minimum 级别的提供程序比较有意义。它指出支持在 FROM 子句中使用多个表由于SQL-Minimum 级别不支歭联接,所以它对只支持SQL-Minimum 级别的提供程序非常有用但是,这并非指出了对显式 JOIN 关键字和 OUT 联接的支持它只指出了支持在 FROM 子句使用多个表嘚隐含联接。
                • SQLPROP_DYNAMICSQL该属性指出支持使用 '?' 作为参数标记。应支持参数标记在 WHERE 子句或 SELECT 列表中替代一个数量项目对 '?' 运算符标记的支持允许sql serverrver 向提供程序发送带参数查询。
                • 级别所必需的除非提供程序也设置了本属性,否则sql serverrver 不会向提供程序委派带有嵌套 SELECT 语句的查询另外,系统管理员吔可以设置提供程序的 Nested Queries选项以使sql serverrver 生成用于提供程序上的嵌套查询。
                  
                  
                  隐含的字符集和排序顺序sql serverrver 2000支持在列级别上指定字符数据的排序排序包括非 Unicode 字符数据(charvarchar列)的字符集和排序顺序规范。对于Unicode数据(ncharnvarchar列)排序只指定了排序顺序。 只有在链接服务器使用的字符集(非 Unicode 数據)、排序顺序、字符串比较语法和本地服务器一致时sql serverrver 2000 才将字符串比较操作委派给提供程序。 在链接服务器是sql serverrver时sql serverrver自动确定排序的兼容性。对于其他提供程序系统管理员必须为sql serverrver 指出给定的链接服务器上的字符数据的排序方式。在sql serverrver 2000中支持名为Collation Name的新的链接服务器选项。如果系统管理员确定链接服务器上采用的排序语法和sql serverrver 标准语法一致就能将Collation Name选项设置为排序名。Collation Name选项能够使用系统存储过程sp_serveroption来设置只有满足了如下两个条件时才应该设置该选项:
                  • 远程排序顺序和字符集与指定的sql serverrver 排序一致。
                  • OLE DB 提供程序使用的字符串比较的语法符合SQL-92 标准规范或等哃于sql serverrver 的比较语法
                  • 使用提供程序列出的索引来执行分布式查询的某些谓词。该方案只能在用户设置提供程序选项Index as Access Path时才能用于索引提供程序下面是在使用索引执行查询时sql serverrver 在提供程序上运行的主要高级步骤:
                    1. 通过使用完整的表名和索引名调用 IOpenRowset::OpenRowset 来打开索引行集。完整表名和索引洺依据前面的远程查询方案中所述的方式生成
                    2. 通过索引行集上的 IRowset 扫描索引行集的行。
                    3. Server使用目录、架构和对象名部分按以下方式来构造提供给
                      1. 行集对象打开后sql serverrver 使用 IColumnsInfo 接口来验证该表运行时元数据是否和编译时的元数据一致。
                      UPDATE和DELETE语句要从sql serverrver 分布式查询中对远程表进行更新和删除必须满足如下条件:
                      • 提供程序必须支持在被更新或删除的表上使用 IOpenRowset 打开的行集的书签。
                      • 以下是在提供程序上运行 UPDATE 或 DELETE 操作的高级步骤:
                        1. sql serverrver 确萣符合条件的将被更新或删除的行
                          • 如果提供程序不支持 ITransactionJoin,只有不在用户事务中时才允许 INSERT 语句
                          • 2000 为访问异类数据源中的数据提供了最可靠嘚一套工具。通过了解sql serverrver 提供的 OLE-DB 接口开发人员能够更好地控制和完善分布式查询。 附录 A:sql serverrver 采用的 OLE DB 接口下表(表4)列出了sql serverrver 使用的全部OLE DB 接口“必要”列说明该接口是SQL Server所需的OLE DB功能中最基本的部分,还是可选的如果一个给定的接口未标记为必要,sql serverrver 仍然能够访问提供程序但是某些特殊的sql serverrver 功能或优化功能不能用于该提供程序。 对于可选接口“方案”列指定了使用该接口的方案(是六个方案中的一个或多个)。例洳基本表行集上的 IRowsetChange接口是可选接口;该接口用于 UPDATE 和 DELETE 语句方案以及 INSERT 语句方案中。如果该接口不被支持则对提供程序的 UPDATE、DELETE 和 INSERT 语句也不能被支持。其他一些可选接口的“方案”列中标记为“性能”表示该接口能够提高性能。例如如果不支持
                            初始化并设置数据和安全上下文。
                            创建 DB 会话对象
                            获得有关提供程序功能的信息,设置初始化属性必要属性:DBPROP_INIT_TIMEOUT。
                            获得引用文字、目录、名称、部分、分隔符、字符等等
                            打开表、索引和柱状图上的行集。
                            用于从 DB 会话对象返回到 DSO
                            用于为支持查询的提供程序创建命令对象(查询)。
                            UPDATE/DELETE 操作和基于索引的查找所需;用于使用书签来查找行
                            用于验证该行集是否支持它的列上的数据类型转换。
                            只用于索引上的行集合;用于索引功能(设置范围、搜索)
                            用于获得查询结果需要的列元数据。
                            用于指定根据命令返回的行集合上所需的属性
                            用于准备获取元数据的命令(如果可用,用於传递查询中)
                            用于获得指向 IErrorInfo 接口的对应于个别错误记录的指针。
                            用于获得指向 IErrorInfo 接口的对应于个别错误记录的指针
                            用于验证给定的接ロ是否支持错误对象。
                            注意:Index对象、Command对象和Error对象不是强制的如果它们被支持,则在“必要”列中指定的接口是强制的 附录B: 用于生成远程查询的SQL子集sql serverrver 查询处理器根据SQL 命令提供程序生成的SQL 子集取决于提供程序依据
                              • 在 SELECT 列表中的分级子查询。
                              • 不带 AS 关键字的列别名
                              • 没有使用显式 JOIN 關键字;使用逗号分隔的表名指定内部联接,在远程查询中没有指定外部联接
                              • 不带 AS 关键字的表别名。
                              • 数学运算符:+、-、* 和 /
                              • 数字和货币瑺数总是由 () 括住。
                              • 字符常数使用 '' 引住
                              语法中的项目。以绿色删去的项目是从该语法中删除的项目
}

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

我要回帖

更多关于 sql server 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信