分布式查询的使用准则

只要访问接口支持所需的 OLE DB 接口,则本主题中所提到的每一类 Transact-SQL 语句均可以使用。

Transact-SQL 语句

以下列表列出了 Transact-SQL 语言的一些子集,可对通过基于链接服务器的名称或临时名称访问的远程表使用这些子集:

  • 所有具有标准格式 SELECT select_list FROM 子句 WHERE 子句的查询均允许使用。当 new_table_name 引用远程表时,不允许使用 SELECT 语句的 INTO new_table_name 子句。

  • 在 SELECT、INSERT、UPDATE 和 DELETE 语句中,不能用单个部分或四个部分组成的表名限制远程表中的列。应在 FROM 子句中指定远程表的别名,并且别名应用于限定列名。

  • 无法查询包含 xml 列的表,即使查询可以访问该表中的非 xml 列。

  • 将远程表中的大型对象 (LOB) 列指定为 SELECT 语句的 select_list 中的项时,SELECT 语句不能包含 ORDER BY 子句。

  • IS NULL 和 IS NOT NULL 谓词不能引用远程表中的 LOB 列。

  • 当查询中还包含 WHERE 子句时,在分布式查询中不能使用 GROUP BY ALL。支持不指定 ALL 的 GROUP BY 子句。

  • 只要访问接口符合 OLE DB 对 INSERT 语句的要求,就允许对远程表使用 INSERT 语句。有关详细信息,请参阅 OLE DB 访问接口的执行 INSERT 的条件

  • 无法通过分布式查询将 NULL 常量插入 timestamp 列中。

  • 分布式查询不支持 $IDENTITY 和 $ROWGUIDCOL。无法将显式值插入远程表中的标识列。

  • 如果访问接口符合指定表的 OLE DB 接口要求,则允许对远程表使用 UPDATE 和 DELETE 语句。有关详细信息,请参阅 OLE DB 访问接口的 UPDATE 和 DELETE 语句要求

  • 如果访问接口符合对某个远程表进行更新的条件,那么当在 UPDATE 或 DELETE 语句(UPDATE 或 DELETE remote_table WHERE CURRENT OF cursor_name)中指定了该远程表时,即可通过在分布式查询中定义的游标对该远程表进行更新或删除。有关详细信息,请参阅在分布式查询中使用游标

  • 不支持对远程表使用 READTEXT、WRITETEXT 和 UPDATETEXT 语句。

  • 如果在 SQL Server 进程外对访问接口进行实例化,则无法在更新或插入操作中引用具有大型对象数据类型(如 text、ntext 或 image)的列,访问接口选项 AllowInProcess 为 0。有关详细信息,请参阅为分布式查询配置 OLE DB 访问接口

  • 不允许对链接服务器使用数据定义语言语句(如 CREATE、ALTER 或 DROP 语句)。

  • EXECUTE 语句可以使用 AT 关键字向链接服务器发送传递命令。能否执行该语句取决于链接服务器的 RPC 配置,还取决于链接服务器能否执行该语句。

  • 不允许对链接服务器执行其他数据库级的操作或语句。

其他准则

下面是其他一些限制和准则:

  • STATIC 或 INSENSITIVE 游标可以引用远程表。如果 OLE DB 访问接口满足某些要求,则 KEYSET 游标可以引用远程表。有关这些要求的详细信息,请参阅由键集驱动的游标对 OLE DB 访问接口的要求。其他类型的游标不可以引用远程表。

  • 只对 SQL Server 数据源支持存储过程。

  • 必须先将连接的 ANSI_NULLS 和 ANSI_WARNINGS 选项设置为 ON,然后该连接才能执行分布式查询。有关详细信息,请参阅 SET ANSI_DEFAULTS (Transact-SQL)

  • 若要在某一链接服务器上使用表时创建最佳查询计划,查询处理器必须具有来自该链接服务器的数据分布统计。对表的任何列具有有限权限的用户可能没有足够的权限来获取所有有用的统计,并且可能会收到效率较低的查询计划和经历不佳的性能。如果链接服务器是 SQL Server 的实例,若要获取所有可用的统计,用户必须拥有该表或者是链接服务器上 sysadmin 固定服务器角色、db_owner 固定数据库角色或者 db_ddladmin 固定数据库角色的成员。