我有一个旧的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的好块。
谢谢!
答案 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()
- 方法解决了字符串和包含的转义实体的问题。这样做,所有转义字符都会被隐式重新转义。