Эффективный способ в SQL Server для удаления всех "InvalidXMLCharacters" из NVARCHAR - PullRequest
0 голосов
/ 07 ноября 2019

Как часть этого ответа , я определил, что одной из вещей, которые могут сломать куб OLAP, является передача ему значений (в именах измерений / значениях / и т. Д.), Которые содержат символы, которые считаются" InvalidXMLCharacters ". Теперь я хотел бы отфильтровать эти значения, чтобы они никогда не попадали в кубы OLAP, которые я строил в SQL. Я часто импортирую эти входные данные из одной таблицы в другую. Примерно так:

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

Есть ли эффективный способ удалить все "InvalidXMLCharacters" из моих столбцов в этом запросе?

Очевидное решение, которое приходит на ум, - это своего рода Regex, хотя из ранее заявленных связанных постов это может быть довольно сложно, и я не уверен в последствиях для производительности, связанных с этим.

Другая идея, которая у меня возникла, - преобразовать столбцы в тип данных «XML», но это приведет к ошибке, если они содержат недопустимые символы, не очень полезно для их удаления ...

IЯ посмотрел вокруг и не видел много других случаев, когда разработчики пытаются сделать именно это, был ли другой вопрос решен в другом посте, который я не нашел?

1 Ответ

0 голосов
/ 07 ноября 2019

.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;
}
...