如何从离散的varchar元素中选择xml?

时间:2017-02-02 20:52:27

标签: xml sql-server-2012

我有一个旧的SQL Server表,其中包含varchar(2056)列,其中每行包含XML的谨慎“元素”。有没有办法使用T-SQL将它们选择为真正的XML?

这会让你知道我在处理什么:

declare @xmlTable table(
    Value varchar(2056)
)

insert into @xmlTable 
values ( '<Root>' ),
       ( '  <Child id="1">' ),
       ( '    <Name>Sam</Name>' ),
       ( '  </Child>' ),
       ( '  <Child />' ),
       ( '</Root>' )

问题是每个元素都在表中的自己的行上,而open / close标记可以分开几行。我已经尝试过转换为XML,但由于每行都不是有效的xml,因此失败了。我也尝试过旧的“select column to CSV using for XML”技巧(创建一个我可以施放的字符串),但这会转换我的“&gt;”到“&amp; gt;”等

我正在使用SQL Server 2012,这个特定的表有超过650k行分布在560个“文档”中。我希望能说出类似的话:

select Value
from @xmlTable
for xml path( '' ), type

并返回可查询XML的好块。

谢谢!

1 个答案:

答案 0 :(得分:1)

试试这样:

declare @xmlTable table(
    Value varchar(2056)
)

insert into @xmlTable 
values ( '<Root>' ),
       ( '  <Child id="1">' ),
       ( '    <Name>Sam</Name>' ),
       ( '  </Child>' ),
       ( '  <Child />' ),
       ( '</Root>' );

SELECT CAST
(
    (
    SELECT Value AS [*] 
    FROM @xmlTable 
    FOR XML PATH(''),TYPE
    ).value('.','nvarchar(max)')
AS XML);

使用,TYPE并在此之后使用value() - 方法解决了字符串和包含的转义实体的问题。这样做,所有转义字符都会被隐式重新转义。