【问题标题】:SQL Server: inline conditional convert with XML?SQL Server:使用 XML 进行内联条件转换?
【发布时间】:2023-03-25 21:45:02
【问题描述】:

我需要将纯文本列中的数据转换为 xml 列。但是,并非所有内容都是有效的 XML,因此我需要忽略任何包含无效 XML 的行。有没有办法可以使用某种内联条件转换或 WHERE 子句中的某些东西来过滤掉无效数据?

【问题讨论】:

    标签: sql sql-server xml sql-server-2005 tsql


    【解决方案1】:

    听起来您需要一个用于 XML 数据的 ISNUMERIC 函数版本。

    很遗憾,不存在这样的内置函数 - 因此您必须设计自己的替代方案,有几个选项可供选择:

    如果这是一个一次性或小规模的过程,其性能并不重要,您可以在游标内一次处理一行输入表,使用TRY...CATCH 块来处理无效转换(未经测试) :

    DECLARE xmlCur CURSOR FOR
    SELECT textcol 
    FROM inputTable
    
    OPEN xmlCur
    DECLARE @string nvarchar(MAX)
    DECLARE @xml xml
    
    FETCH NEXT FROM xmlCur into @string
    
    WHILE @@fetch_status = 0
    BEGIN
        BEGIN TRY
            SET @xml = CAST(@string AS XML)
            -- Do something with XML
        END TRY
        BEGIN CATCH
            -- log failure/mark source row as invalid
        END CATCH
    
        FETCH NEXT FROM xmlCur into @string
    END
    
    CLOSE xmlCur
    DEALLOCATE xmlCur 
    

    或者,如果您对 .Net 编程感到满意(并且它已在您的服务器上启用),您可以使用 CLR 创建您自己的 IsXML 函数。 .Net 代码不会比this thread 上的第三个帖子复杂多少。

    CLR 解决方案的性能可能并不比游标好多少 - 您需要进行测试才能确定这一点。

    (一个明显的尝试但不起作用的是标量值 T-SQL 函数,它尝试将字段转换为 TRY...CATCH 块内的 XML。但是,TRY...CATCH 不允许在功能。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多