我在SQLServer2005数据库中有超过一百万行,其中包含XML字符串的文本列。我想将文本转换为XML数据类型以提取部分数据。将文本安全地转换为XML
问题是有些记录会在投射时抛出错误(即无效的XML)。如何忽略这些错误,以便所有有效的XML都能正确输出,并将无效的XML存储为空?
我在SQLServer2005数据库中有超过一百万行,其中包含XML字符串的文本列。我想将文本转换为XML数据类型以提取部分数据。将文本安全地转换为XML
问题是有些记录会在投射时抛出错误(即无效的XML)。如何忽略这些错误,以便所有有效的XML都能正确输出,并将无效的XML存储为空?
一旦出现类似的情况,我将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
另一种可能性,应写其加载XML到XmlDocument的.NET程序集,返回一个布尔值,如果XML是有效的,这样就可以实际SQL解析它
我知道这是SQL服务器2012+的功能,但因为这个问题是这里的顶级谷歌的结果是:
SELECT
COALESCE(TRY_CONVERT(xml, '</bad xml>'), 'InvalidXML')
您可以在这里找到的文档:TRY_CONVERT (Transact-SQL)
张贴后,我来到了机智h与游标非常相似(仍然是RBAR - 不错的术语)。不过,我试过你的代码,它的效果很好!避免游标和失败消息的好方法是一个很好的方法。谢谢 – 2011-04-20 23:18:20