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数据类型......”这发生在过去,我没有时间机器。
我认为你最好的选择是编写自定义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
是的,并基于它创建一个持久性计算列,所以每当你去'where valid_xml = 1'时都不会调用它。 – GSerg 2010-09-22 16:49:18
它是确定性的吗? – 2010-09-22 17:06:33
我希望我有这样的IsValidXML()
功能,太.....不幸的是,我不认为有这样的事情.....
只是一个想法:有什么你可以检查到过滤出无效的XML?
E.g.你能过滤掉所有那些不以.....</data>
或类似的东西结束吗? (看到你说你无效的XML通常是截断的XML,所以我会认为结束标记 - </data>
或其他 - 在这些情况下会丢失)。
嗯有趣的是,最后的字节总是相同的,所以我可以过滤掉那些不匹配的东西?幸运的是,在这种情况下,xml都使用相同的模式,因此它们都应该有一个匹配的结束根元素 – 2010-09-22 16:33:20