我在varchar列中存储了一些有效且无效的xml值。
我想将有效的xml值转换为实际的xml数据类型,并且无效为null。
这样做的好方法是什么?
类似的东西:
SELECT
CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML)
ELSE null
END
答案 0 :(得分:7)
仅对此作出回应:
是的,但问题的核心是我如何检查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
值的表,如果无法正确转换,则不插入该值。 See this thread for examples
答案 1 :(得分:3)
尝试使用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
答案 2 :(得分:0)
如果您需要保持 XML 有效或无效,您可以在IsValid (bit)
这样的表格上设置标记。然后,加载过程可以对此数据进行一次性检查,以检查XML是否有效,并根据结果设置标志。这样,您可以使用查询获取有效的XML:
SELECT
CASE WHEN IsValid = 1 THEN CAST(xml_data as XML)
ELSE null
END
如果您不需要保留无效的XML,那么只需在加载过程中拒绝它,将字段设置为NULL
,这样查询就会如下所示:
SELECT
CASE WHEN xml_data IS NOT NULL THEN CAST(xml_data as XML)
ELSE null
END
这两种方式都会为{strong>每个查询传递SQL function
提供更好的效果。