sql-server – 为非XML数据查询链接服务器时,为什么会收到错误“分布式查询中不支持Xml数据类型”?

我有两个SQL Server(运行SQL Server 2008)名为DATA01和DATA02。 DATA02有一个链接服务器定义LINK,指向DATA01,并设置合适的用户映射。在DATA01上有一个数据库MyDatabase包含这两个表:

CREATE TABLE T_A (
    Id int
)

CREATE TABLE T_B (
    Id int,
    Stuff xml
)

当我从DATA02运行这个命令,我得到如预期返回的数据:

SELECT Id FROM LINK.MyDatabase.dbo.T_A;

然而,当我从DATA02运行这个命令,我得到一个错误:

SELECT Id, Stuff FROM LINK.MyDatabase.dbo.T_B;

错误是

Xml data type is not supported in distributed queries. Remote object ‘DATA02.MyDatabase.dbo.T_B’ has xml column(s).

奇怪的是,这个命令:

SELECT Id FROM LINK.MyDatabase.dbo.T_B;

也给出相同的错误,即使我不是选择xml列!这是怎么回事?

这是SQL Server中的一个缺陷。在表上只存在一个xml列阻止它参与分布式查询(例如通过链接服务器连接查询)。这is mentioned in the documentation,虽然不是特别突出。你可以看到main Connect bug report here和一个similar report here.后者给出了两个解决方法:

>

Create view without the XML column(s) on remote server and query that.

在你的例子中,这将涉及添加一个视图到MyDatabase
看起来像这样:

CREATE VIEW V_T_B AS SELECT Id FROM T_B;

然后,您可以通过链接查询此视图以获取Id
数据。注意类似的东西

SELECT Id FROM ( SELECT Id FROM T_B ) T_B;

不工作。
>

Use a pass-through query in the form

06002

该方法具有不需要任何改变的优点
源数据库;缺点是它不再可能
使用本地和链接数据的标准四部分命名。的
查询会像

SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B;

注意,如果你确实想要xml数据,这个方法(沿着
与从非xml数据类型转换):

SELECT Id, CAST(Stuff AS XML) Stuff 
FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff 
                        FROM T_B') T_B;

请注意,该错误首次在SQL Server 2005中报告,并在SQL Server 2014中保持不固定。

http://stackoverflow.com/questions/14442039/why-do-i-get-the-error-xml-data-type-is-not-supported-in-distributed-queries-w

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:sql-server – 为非XML数据查询链接服务器时,为什么会收到错误“分布式查询中不支持Xml数据类型”?