连接XML而不将类型转换为字符串

Moi*_*ala 15 xml sql-server concatenation sql-server-2008

我在SQL SERVER数据库中的各种表中生成了以下XML

<XMLData>
...
<Type>1</Type>
...
</XMLData>
Run Code Online (Sandbox Code Playgroud)

<XMLData>
...
<Type>2</Type>
...
</XMLData>
Run Code Online (Sandbox Code Playgroud)

<XMLData>
...
<Type>3</Type>
...
</XMLData>
Run Code Online (Sandbox Code Playgroud)

我需要的最终输出是单个组合如下:

<AllMyData>
    <XMLData>
        ...
        <Type>1</Type>
        ...
    </XMLData>
    <XMLData>
        ...
        <Type>2</Type>
        ...
    </XMLData>
    <XMLData>
        ...
        <Type>3</Type>
        ...
    </XMLData>
<AllMyData>
Run Code Online (Sandbox Code Playgroud)

注 - 我合并的所有独立元素都具有相同的标记名称.

提前感谢您查看此内容.

Mik*_*son 17

我在SQL SERVER数据库中的各种表中生成了以下XML

取决于你如何拥有它,但如果它在XML变量中,你可以这样做.

declare @XML1 xml
declare @XML2 xml
declare @XML3 xml

set @XML1 = '<XMLData><Type>1</Type></XMLData>'
set @XML2 = '<XMLData><Type>2</Type></XMLData>'
set @XML3 = '<XMLData><Type>3</Type></XMLData>'

select @XML1, @XML2, @XML3 
for xml path('AllMyData')
Run Code Online (Sandbox Code Playgroud)


use*_*764 6

我不能发表评论但可以回答,即使我认为评论更合适,我会扩展上面的rainabba回答以增加更多控制.我的.Net代码需要知道返回的列名,所以我不能依赖自动生成的名称,但需要上面提供的非常尖端的rainabba.

这样,xml可以有效地连接成一行,并将结果列命名为.您可以使用相同的方法将结果分配给XML变量,并从PROC返回该变量.

SELECT (
 SELECT XmlData as [*]
 FROM
     (
     SELECT
         xmlResult AS [*]
     FROM
         @XmlRes
     WHERE
         xmlResult IS NOT NULL
     FOR XML PATH(''), TYPE
     ) as DATA(XmlData)
 FOR XML PATH('')
) as [someColumnName]
Run Code Online (Sandbox Code Playgroud)


And*_*mar 5

如果使用for xml type,则可以组合XML列而不进行转换.例如:

select  *
from    (
        select  (
                select  1 as Type
                for xml path(''), type
                )
        union all
        select  (
                select  2 as Type
                for xml path(''), type
                )
        union all
        select  (
                select  3 as Type
                for xml path(''), type
                )
        ) as Data(XmlData)
for xml path(''), root('AllMyData'), type
Run Code Online (Sandbox Code Playgroud)

这打印:

<AllMyData>
    <XmlData>
        <Type>1</Type>
    </XmlData>
    <XmlData>
        <Type>2</Type>
    </XmlData>
    <XmlData>
        <Type>3</Type>
    </XmlData>
</AllMyData>
Run Code Online (Sandbox Code Playgroud)