1

我正在尝试将 FOR XML 查询的结果作为文本获取。我在这里发现了一些类似的问题: Using SQL Server "FOR XML": Convert Result Datatype to Text/varchar/string 不管什么? 但在我的情况下,我使用 WITH XMLNAMESPACES 语句,这个解决方案对我不起作用。如何以文本形式获得以下查询的结果?

WITH XMLNAMESPACES ('urn:blablablabla' as bi) 
SELECT 'urn:blablabla.xsd' AS "@xsi:schemaLocation",  

        (SELECT 'aaaa' AS 'bi:idValue', 
                'bbbb' AS 'bi:idContext' 
        FOR XML PATH('bi:Part1'),TYPE), 

        (SELECT 'cccc' AS 'bi:idValue', 
                'dddd' AS 'bi:idContext' 
        FOR XML PATH('bi:Part2'),TYPE) 
 FOR XML PATH('bi:Items'), ELEMENTS XSINIL 

谢谢


结果应如下所示:

<bi:Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bi="urn:blablablabla" xsi:schemaLocation="urn:blablabla.xsd">
<bi:Part1 xmlns:bi="urn:blablablabla">
 <bi:idValue>aaaa</bi:idValue>
 <bi:idContext>bbbb</bi:idContext>
</bi:Part1>
<bi:Part2 xmlns:bi="urn:blablablabla">
 <bi:idValue>cccc</bi:idValue>
 <bi:idContext>dddd</bi:idContext>
</bi:Part2>
</bi:Items

我的目标是将此结果作为文本而不是 XML 数据类型。例如做这样的事情:

DECLARE @ResultText NVARCHAR(MAX) 
SET @ResultText = ... Returned text from this query ...

另外,也许您知道如何避免在每个节点中重复命名空间?

谢谢

4

1 回答 1

1

您需要使用select而不是set.

DECLARE @ResultText NVARCHAR(MAX);

WITH XMLNAMESPACES ('urn:blablablabla' as bi) 
SELECT @ResultText = 
  (
    SELECT 'urn:blablabla.xsd' AS "@xsi:schemaLocation",  

            (SELECT 'aaaa' AS 'bi:idValue', 
                    'bbbb' AS 'bi:idContext' 
            FOR XML PATH('bi:Part1'),TYPE), 

            (SELECT 'cccc' AS 'bi:idValue', 
                    'dddd' AS 'bi:idContext' 
            FOR XML PATH('bi:Part2'),TYPE) 
     FOR XML PATH('bi:Items'), ELEMENTS XSINIL 
);

更新:

避免重复命名空间

根据这两个答案,有一种方法可以做到这一点for xml explicit

FOR XML PATH 和 xsi:nil 属性
如何在使用 FOR XML PATH 时删除嵌套查询中的冗余命名空间

如果您希望将来改变行为,您可以对此连接项目进行投票。
在嵌套的 SELECT FOR XML 语句中抑制命名空间属性

于 2012-04-08T08:04:58.950 回答