SQL Server 2005中varbinary(max)列中的XML无效

问题描述:

因此,我在SQL Server 2005中获得了varbinary(max)列,它充满了XML。某处有几条记录截断了XML,因此它们无效。SQL Server 2005中varbinary(max)列中的XML无效

这意味着,如果我跑

SELECT CAST(myVarbinaryColumn as XML) ... 

它吹块。

如何过滤/跳过无效的XML?

当我已经完成类似与假定有日期的varchar我可以使用ISDATE(blah) = 1。所以相当于ISVALIDXML()会很好。

请不要评论“为什么不是列XML数据类型......”这发生在过去,我没有时间机器。

+0

嗯有趣的是,最后的字节总是相同的,所以我可以过滤掉那些不匹配的东西?幸运的是,在这种情况下,xml都使用相同的模式,因此它们都应该有一个匹配的结束根元素 – 2010-09-22 16:33:20

我认为你最好的选择是编写自定义CLR function,或许使用XmlDocument.Load。在CLR中,您可以将错误加载到失败的负载上并返回适当的结果。

编辑:下面的代码也可以工作,虽然它不如UDF优雅。不幸的是,我们不能在UDF中使用TRY/CATCH。

create procedure dbo.usp_IsValidXML(@XMLCandidate varbinary(max), @Return bit output) 
as 
begin 
    declare @x xml 
    begin try 
     set @x = cast(@XMLCandidate as xml) 
     set @Return = 1 
    end try 
    begin catch 
     set @Return = 0 
    end catch 
end 
go 

declare @test1 varbinary(max) 
declare @test2 varbinary(max) 
set @test1 = cast('<data>asdf</data>' as varbinary(max)) 
set @test2 = cast('<data>asdf</da' as varbinary(max)) 

declare @IsValid bit 
exec dbo.usp_IsValidXML @test1, @IsValid output 
select @IsValid 
exec dbo.usp_IsValidXML @test2, @IsValid output 
select @IsValid 

drop procedure dbo.usp_IsValidXML 
+0

是的,并基于它创建一个持久性计算列,所以每当你去'where valid_xml = 1'时都不会调用它。 – GSerg 2010-09-22 16:49:18

+0

它是确定性的吗? – 2010-09-22 17:06:33

我希望我有这样的IsValidXML()功能,太.....不幸的是,我不认为有这样的事情.....

只是一个想法:有什么你可以检查到过滤出无效的XML?

E.g.你能过滤掉所有那些不以.....</data>或类似的东西结束吗? (看到你说你无效的XML通常是截断的XML,所以我会认为结束标记 - </data>或其他 - 在这些情况下会丢失)。