t-sql:将varchar转换为xml

时间:2013-07-30 16:41:56

标签: sql-server sql-server-2008 tsql xml-parsing

我在varchar列中存储了一些有效且无效的xml值。

我想将有效的xml值转换为实际的xml数据类型,并且无效为null。

这样做的好方法是什么?

类似的东西:

SELECT 
    CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML)
    ELSE null 
END

3 个答案:

答案 0 :(得分:7)

仅对此作出回应:

  

是的,但问题的核心是我如何检查XML是否有效   第一名?

你的XML在某种意义上是无效的,就像下面的第二行一样:

SELECT CAST('<xml>Yep this is xml</xml>' AS XML)
SELECT CAST('<xml>Nope, not xml</x' AS XML)

我看到的一个解决方案是逐行方法,您尝试CASTXML,如果它转换成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提供更好的效果。