【问题标题】:t-sql: convert varchar to xmlt-sql:将 varchar 转换为 xml
【发布时间】:2013-07-30 22:30:23
【问题描述】:

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

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

有什么好的方法可以做到这一点?

类似:

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

【问题讨论】:

  • 什么版本的 SQL Server?
  • Microsoft SQL Server 2008 (SP1)
  • 你能不能在加载这个数据期间运行一个进程来拒绝无效的XML,否则你每次使用这个select语句时都是通过一个函数运行这个查询,这性能不理想。
  • 是的,我知道。这就是我在加载之前尝试识别无效 XML 值的方式。
  • 在这里查看答案:stackoverflow.com/a/43740683/3692256

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


【解决方案1】:

仅针对此:

是的,但我的问题是如何检查 XML 在 第一名?

从某种意义上说,您的 XML 是否无效,如下面的第二行所示:

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

我看到的一个解决方案是逐行方法,您尝试将CAST 一行作为XML,如果它转换为XML,则成功地将有效行插入到具有有效@987654326 的表中@values,如果不能正确转换,则不会插入该值。 See this thread for examples.

【讨论】:

  • 感谢其他线程的链接,它建议手动解析有问题的令牌。这就是我最终所做的。
【解决方案2】:

尝试使用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

【讨论】:

  • 非凡!非常感谢您提供此解决方案。
【解决方案3】:

如果您需要保持 XML 有效或无效,您可以在表格上设置一个 flag,例如 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

对于每个查询,通过SQL function 传递这两种方式都会提供更好的性能。

【讨论】:

  • 是的,但我的问题是我如何首先检查 XML 是否有效?
  • I have some valid and invalid xml values stored in a varchar column. - 此存储步骤是否在您的控制之下?还是您正在查询预先填充的表格?
  • 一个预填充的表格。基本上,我需要一种使用 t-sql 检查 XML 字符串有效性的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2013-07-21
相关资源
最近更新 更多