我有两个SQL服务器(运行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数据类型在分布式查询支持。 远程对象“DATA02.MyDatabase.dbo.T_B”具有XML列(多个)。
而奇怪的是,这个命令:
SELECT Id FROM LINK.MyDatabase.dbo.T_B;
也给出了同样的错误, 即使我没有SELECT
荷兰国际集团XML列! 这是怎么回事?
这是在SQL Server中的缺陷。 在桌子上的XML列仅仅存在防止它参与分布式查询(例如:正在通过链接服务器连接查询)。 这是在文档中提到的 ,虽然不是特别突出。 你可以看到这里主要的连接错误报告 ,和这里类似的报告 。 后者给出了两种解决方法:
没有远程服务器上的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;
不工作。
形式使用传递查询
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不固定。
试试这个:
- 创建在源极侧与XML浇铸到为nvarchar(最大)的图:
CREATE VIEW vXMLTest AS SELECT CAST(的东西,为nvarchar(MAX))为STUFF FROM T_B
SELECT角色(东西作为XML)作为东西FROM OPENQUERY(DATA02, 'SELECT东西FROM vXMLTest')
该解决方案在2008R2对我的作品。
我发现这样做的另一种方式:
- 创建一个
Linked Server
上DATA01
, DATA02
,甚至一些第三方服务器(可以是本地的)。 - 使用执行查询
EXEC [linked_server].[sp_sqlexecute]
为什么我更喜欢创建视图或使用这种方法OPENQUERY
?
- 这种方法不需要有链接服务器上的任何权限(你不需要创建视图)。
- 你可以通过使用一个参数查询
sp_sqlexecute
语法( 找到sp_sqlexecute这里了解更多信息 )。 对于OPENQUERY
你必须通过一个STRING
或TEXT_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?