using Microsoft.SqlServer.TransactSql.ScriptDom; using System.Text; namespace SQLLinter.Common.Helpers; public static class SQLHelpers { /// /// Проверяет, что строка может быть закодирована в указанной SQL кодировке (collation). /// /// Строка для проверки /// Имя кодировки, например "windows-1251" или "iso-8859-1" /// true, если строка полностью совместима public static bool IsValidForEncoding(string input, string sqlEncodingName) { if (string.IsNullOrEmpty(input)) return true; Encoding enc; try { // Включаем поддержку старых кодировок (ANSI, OEM) Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); enc = Encoding.GetEncoding(sqlEncodingName, new EncoderReplacementFallback("?"), new DecoderReplacementFallback("?")); } catch (ArgumentException) { throw new ArgumentException($"Неизвестная кодировка: {sqlEncodingName}"); } return IsValidForEncoding(input, enc); } public static bool IsValidForEncoding(string input, Encoding enc) { if (string.IsNullOrEmpty(input)) return true; // Пробуем закодировать и декодировать обратно byte[] bytes = enc.GetBytes(input); string roundtrip = enc.GetString(bytes); // Если после кодирования/декодирования строка совпала - значит все символы поддерживаются return roundtrip == input; } public static string ObjectGetFullName(SchemaObjectName name) => ObjectGetFullName(name.Identifiers); public static string ObjectGetFullName(IList identifiers) { return string.Join(".", identifiers.Select(i => "[" + i.Value + "]")); } }