Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中删除“所有”的有效方法;InvalidXMLCharacters“;来自女巫_Sql_Sql Server_Xml_Tsql_Olap - Fatal编程技术网

SQL Server中删除“所有”的有效方法;InvalidXMLCharacters“;来自女巫

SQL Server中删除“所有”的有效方法;InvalidXMLCharacters“;来自女巫,sql,sql-server,xml,tsql,olap,Sql,Sql Server,Xml,Tsql,Olap,作为测试的一部分,我确定可以破坏OLAP多维数据集的一个因素是向它输入值(在维度名称/值/etc中),其中包含被视为“”的字符。现在我想过滤掉这些值,这样它们就永远不会出现在我在SQL中构建的OLAP多维数据集中。我经常发现自己将这些输入数据从一个表导入到另一个表中。如下所示: INSERT INTO [dbo].[DestinationTableThatWillBeReferencedInMyOLAPCube] SELECT TextDataColumn1, TextDataColumn2,

作为测试的一部分,我确定可以破坏OLAP多维数据集的一个因素是向它输入值(在维度名称/值/etc中),其中包含被视为“”的字符。现在我想过滤掉这些值,这样它们就永远不会出现在我在SQL中构建的OLAP多维数据集中。我经常发现自己将这些输入数据从一个表导入到另一个表中。如下所示:

INSERT INTO [dbo].[DestinationTableThatWillBeReferencedInMyOLAPCube]
SELECT TextDataColumn1, TextDataColumn2, etc... 
FROM [dbo].[SourceTableContainingColumnsWithValuesWithInvalidXMLCharacters]
WHERE XYZ...
是否有一种有效的方法可以删除此查询中我的列中的所有“InvalidXMLCharacters”

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

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


我环顾了一下四周,并没有看到很多其他开发人员正试图做到这一点的情况,在另一篇文章中,我还没有找到其他解决方法吗?

.NET CLR在SQL Server中的集成可能会有所帮助。 下面是一个小的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;
}