【问题标题】:Efficient Way In SQL Server To Remove All "InvalidXMLCharacters" From a NVARCHARSQL Server 中从 NVARCHAR 中删除所有“InvalidXMLCharacters”的有效方法
【发布时间】:2020-03-03 13:55:17
【问题描述】:

作为this answer 的一部分,我确定可能破坏 OLAP 多维数据集的原因之一是向其提供包含被视为“InvalidXMLCharacters”字符的值(在维度名称/值/等中) .现在我想过滤掉这些值,这样它们就不会出现在我用 SQL 构建的 OLAP 多维数据集中。我经常发现自己将这些输入数据从一个表导入到另一个表中。类似于以下内容:

INSERT INTO [dbo].[DestinationTableThatWillBeReferencedInMyOLAPCube]
SELECT TextDataColumn1, TextDataColumn2, etc... 
FROM [dbo].[SourceTableContainingColumnsWithValuesWithInvalidXMLCharacters]
WHERE XYZ...

有没有一种有效的方法可以在此查询中从我的列中删除所有“InvalidXMLCharacters”?

想到的明显解决方案是某种正则表达式,尽管从前面提到的链接帖子来看,这可能非常复杂,我不确定这对性能的影响。

我的另一个想法是将列转换为“XML”数据类型,但如果它们包含无效字符,则会出错,对于删除它们不是很有帮助...

我环顾四周,并没有看到许多其他开发人员正试图做到这一点的案例,是否在我没有找到的另一篇文章中以任何其他方式解决了这个问题?

【问题讨论】:

    标签: sql sql-server xml tsql olap


    【解决方案1】:

    SQL Server 中的 .NET CLR 集成可能会有所帮助。 这是一个小的 c# 示例。您可以将其用作满足您需求的起点。它最重要的一行是使用XmlConvert.IsXmlChar(ch) 调用来删除无效的XML 字符。

    c#

    void Main()
    {
        // https://www.w3.org/TR/xml/#charsets
        // ===================================
        // From xml spec valid chars:
        // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]    
        // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
    
        string content = "fafa\v\f\0";
        Console.WriteLine(IsValidXmlString(content)); // False
    
        content = RemoveInvalidXmlChars(content).Dump("Clean string");
        Console.WriteLine(IsValidXmlString(content)); // True   
    }
    
    // Define other methods and classes here
    static string RemoveInvalidXmlChars(string text)
    {
        return new string(text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray());
    }
    
    static bool IsValidXmlString(string text)
    {
        bool rc = true;
        try
        {
            XmlConvert.VerifyXmlChars(text);
        }
        catch
        {
            rc = false;
        }
    
        return rc;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2022-03-07
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多