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