我有一些存储在varchar列中的有效和无效的xml值。
我想将有效的XML值强制转换为实际的XML数据类型,而将无效的转换为null。
有什么好的方法可以做到这一点吗?
类似这样:
SELECT
CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML)
ELSE null
END
我有一些存储在varchar列中的有效和无效的xml值。
我想将有效的XML值强制转换为实际的XML数据类型,而将无效的转换为null。
有什么好的方法可以做到这一点吗?
类似这样:
SELECT
CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML)
ELSE null
END
仅回答这个问题:
是的,但我的问题实质上是如何首先检查XML是否有效?
您的XML是否无效,就像下面第二行一样会中断:
SELECT CAST('<xml>Yep this is xml</xml>' AS XML)
SELECT CAST('<xml>Nope, not xml</x' AS XML)
我看到的一个解决方案是逐行处理,尝试使用CAST
将一行作为XML
,如果可以成功转换成XML
,就将有效的行插入具有有效XML
值的表中;如果无法正确转换,则不插入该值。有关示例,请参见此线程。
sp_xml_preparedocument
-SET NOCOUNT ON;
DECLARE @XML NVARCHAR(MAX)
SELECT @XML = '<t>test</'
DECLARE @hDoc INT
BEGIN TRY
EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT '"' + @XML + '" is valid'
EXEC sys.sp_xml_removedocument @hDoc
END TRY
BEGIN CATCH
SELECT '"' + @XML + '" is invalid'
END CATCH
SELECT @XML = '<t>test</t>'
BEGIN TRY
EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT '"' + @XML + '" is valid'
EXEC sys.sp_xml_removedocument @hDoc
END TRY
BEGIN CATCH
SELECT '"' + @XML + '" is invalid'
END CATCH
输出 -
-------------------------
"<t>test</" is invalid
-------------------------
"<t>test</t>" is valid
SELECT
CASE WHEN IsValid = 1 THEN CAST(xml_data as XML)
ELSE null
END
NULL
,因此查询将如下所示:SELECT
CASE WHEN xml_data IS NOT NULL THEN CAST(xml_data as XML)
ELSE null
END
无论哪种方式,都比每个查询都通过SQL函数
获得更好的性能。