2011-04-20 109 views
5

我在SQLServer2005数据库中有超过一百万行,其中包含XML字符串的文本列。我想将文本转换为XML数据类型以提取部分数据。将文本安全地转换为XML

问题是有些记录会在投射时抛出错误(即无效的XML)。如何忽略这些错误,以便所有有效的XML都能正确输出,并将无效的XML存储为空?

回答

5

一旦出现类似的情况,我将XML列添加到与Text列相同的表中。然后,我使用RBAR过程试图将文本列中的“XML”复制到新的XML列(不是最快的但是提交单个写入,这将是一次性的,对吗?)。这假设你的表有一个int数据类型的PK。

declare @minid int, @maxid int; 

select @minid=min(ID), @maxid=max(ID) from XMLTable; 

while @minid <= @maxid 
begin 

begin try 

update t 
set XMLColumn = cast(TextColumn as XML) 
from XMLTable t 
where ID = @minid; 

set @minid = @minid+1 

end try 
begin catch 

print('XML transform failed on record ID:'+cast(@minid as varchar)) 

--advance to the next record 
set @minid = @minid+1 
end catch 


end 
+0

张贴后,我来到了机智h与游标非常相似(仍然是RBAR - 不错的术语)。不过,我试过你的代码,它的效果很好!避免游标和失败消息的好方法是一个很好的方法。谢谢 – 2011-04-20 23:18:20

-1

另一种可能性,应写其加载XML到XmlDocument的.NET程序集,返回一个布尔值,如果XML是有效的,这样就可以实际SQL解析它

2

我知道这是SQL服务器2012+的功能,但因为这个问题是这里的顶级谷歌的结果是:

SELECT 
COALESCE(TRY_CONVERT(xml, '</bad xml>'), 'InvalidXML') 

您可以在这里找到的文档:TRY_CONVERT (Transact-SQL)