为什么查询非XML数据的链接服务器时,我得到的错误“XML数据类型在分布式查询支持”?(Why do

2019-07-18 11:46发布

我有两个SQL服务器(运行SQL Server 2008)命名的DATA01DATA02DATA02具有链接服务器定义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数据类型在分布式查询支持。 远程对象“DATA02.MyDatabase.dbo.T_B”具有XML列(多个)。

而奇怪的是,这个命令:

SELECT Id FROM LINK.MyDatabase.dbo.T_B;

也给出了同样的错误, 即使我没有SELECT荷兰国际集团XML列! 这是怎么回事?

Answer 1:

这是在SQL Server中的缺陷。 在桌子上的XML列仅仅存在防止它参与分布式查询(例如:正在通过链接服务器连接查询)。 这是在文档中提到的 ,虽然不是特别突出。 你可以看到这里主要的连接错误报告 ,和这里类似的报告 。 后者给出了两种解决方法:

  1. 没有远程服务器上的XML列(多个)创建并[a]图和查询该。

    在你的榜样,这将涉及添加视图到MyDatabase ,看起来像这样:

     CREATE VIEW V_T_B AS SELECT Id FROM T_B; 

    然后,您可以通过链接查询此视图,获得Id数据。 需要注意的是像

     SELECT Id FROM ( SELECT Id FROM T_B ) T_B; 

    工作。

  2. 形式使用传递查询

     SELECT * from OPENQUERY (... ) 

    该方法具有不需要任何改变到源数据库的优点; 缺点是,它不再是可以使用标准的四部分组成的命名为本地和链接数据。 查询会是什么样子

     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不固定。



Answer 2:

试试这个:

  • 创建在源极侧与XML浇铸到为nvarchar(最大)的图:

CREATE VIEW vXMLTest AS SELECT CAST(的东西,为nvarchar(MAX))为STUFF FROM T_B

  • 您可以强制转换为XML目的地侧选择它

SELECT角色(东西作为XML)作为东西FROM OPENQUERY(DATA02, 'SELECT东西FROM vXMLTest')

该解决方案在2008R2对我的作品。



Answer 3:

我发现这样做的另一种方式:

  1. 创建一个Linked ServerDATA01DATA02 ,甚至一些第三方服务器(可以是本地的)。
  2. 使用执行查询EXEC [linked_server].[sp_sqlexecute]

为什么我更喜欢创建视图或使用这种方法OPENQUERY

  1. 这种方法不需要有链接服务器上的任何权限(你不需要创建视图)。
  2. 你可以通过使用一个参数查询sp_sqlexecute语法( 找到sp_sqlexecute这里了解更多信息 )。 对于OPENQUERY你必须通过一个STRINGTEXT_LEX ,女巫意味着所有的值必须输入正确的这个功能。

这里是例子:

DECLARE @UserID UNIQUEIDENTIFIER = ''

DECLARE @SearchForUserParams NVARCHAR(MAX) = N'@UserID UNIQUEIDENTIFIER';  
DECLARE @SearchForUserQuery NVARCHAR(MAX) = 
N'SELECT
    UserID,
    Username,
    Email,
    CONCART(NVARCHAR(MAX), UserDataXml) AS UserDataXml
FROM User
WHERE UserID = @UserID
'

EXEC [linked_server].[dbo].[sp_executesql] 
    @SearchForUserQuery,
    @SearchForUserParams,
    @UserID = @UserID


文章来源: Why do I get the error “Xml data type is not supported in distributed queries” when querying a linked server for non-xml data?