Как найти недопустимый символ Char в таблице SQL

За последние пару недель это была серьезная головная боль. У меня довольно большой стол (165 колонок x 11000+ строк). В этой таблице есть несколько столбцов комментариев, которые установлены в varchar(max) . Существует, в частности, тот, который продолжает получать недопустимые символы, вставленные в него различными пользователями. Это приводит к сбою отчетов в SSRS. Затем мне нужно найти эти недопустимые символы и удалить их. Это была очень кропотливая трудоемкая задача.

То, что я хотел бы сделать, это найти способ автоматического поиска этих недопустимых символов и заменить их ничем. Проблема в том, что я понятия не имею, как искать поиск непосредственно для этих персонажей. Вот как они выглядят:

Дерьмо в SQL

и вот еще один образ того же:

Дерьмо в SQL

И вот как это выглядит, когда я вставляю его в Notepad ++:

Дерьмо в SQL

Я не уверен, что это сработает и покажет, как я его вижу, но вот персонажи:

㹊 潮 Ņ᯸ࢹᖈư 㹨 ¯Z 槹 鎤 ⻄ ƺ 綐 ڌ⸀ ƺ 삸) 䀤 ƍ 샄) Ņ ᛡ 鎤 ꗘᖃᒨ 쬵 Ğᘍ 鎤 ᐜ Ᏸ> ֔ υ 赸 Ƹ 쳰 డ 촜) 鉀 ௿ 촜) 쮜) Ἡ 屰  山 舰 霡ࣆ 耏 А ం 畠 Ư 놐 ᓜ ત Ꮫ ֔ Ꮫ ఆ 邰 ఍ 드 듄 鎤 듄 듄 듄 띨 띨 띨 띨 샰 샰 샰 샰 샰 샰 샰 샰 샰 ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ ꗘᖃᒨ᯸ࢹ

Они выглядят так, как будто они китайцы или что-то подобное, но я попытался использовать Google Translate и обнаружил их как английский.

Любая помощь в определении способа поиска? Создать функцию или SP будет хорошо, если она работает!

ОБНОВИТЬ

Я пробовал часть решения, которое я нашел здесь: Как найти символы Unicode / не-ASCII в поле NTEXT в таблице SQL Server 2005? и использовал это:

 -- Start with tab, line feed, carriage return declare @str varchar(1024) set @str = '|' + char(9) + '|' + char(10) + '|' + char(13) -- Add all normal ASCII characters (32 -> 127) declare @i int set @i = 32 while @i <= 127 begin -- Uses | to escape, could be any character set @str = @str + '|' + char(@i) set @i = @i + 1 end select MEETING_NOTES from pmdb.TrackerData where MEETING_NOTES like '%[^' + @str + ']%' escape '|' 

Но он возвращает намного больше строк, чем должно быть. В настоящее время у меня есть только одна строка с этими недопустимыми символами, и она возвращается 1708.

ОБНОВЛЕНИЕ 2

Я создал Function чтобы попытаться удалить все недопустимые символы следующим образом:

 ALTER FUNCTION [dbo].[RemoveNonPrintable] ( @inputtext nvarchar(max) ) RETURNS nvarchar(max) AS BEGIN DECLARE @counter int = 1; DECLARE @colString nvarchar(1000) set @inputtext = REPLACE(@inputtext, char(0), '') -- 'NULL' set @inputtext = REPLACE(@inputtext, char(1), '') -- 'Start of Heading' set @inputtext = REPLACE(@inputtext, char(2), '') -- 'Start of Text' set @inputtext = REPLACE(@inputtext, char(3), '') -- 'End of Text' set @inputtext = REPLACE(@inputtext, char(4), '') -- 'End of Transmission' set @inputtext = REPLACE(@inputtext, char(5), '') -- 'Enquiry' set @inputtext = REPLACE(@inputtext, char(6), '') -- 'Acknowledgement' set @inputtext = REPLACE(@inputtext, char(7), '') -- 'Bell' set @inputtext = REPLACE(@inputtext, char(8), '') -- 'Backspace' set @inputtext = REPLACE(@inputtext, char(9), '') -- 'Horizontal Tab' -- replace line feed with blank, so words that were in different lines before are still separated set @inputtext = REPLACE(@inputtext, char(10), ' ') -- 'Line Feed' set @inputtext = REPLACE(@inputtext, char(11), '') -- 'Vertical Tab' set @inputtext = REPLACE(@inputtext, char(12), '') -- 'Form Feed' -- replace carriage return with blank, so words that were in different lines before are still separated set @inputtext = REPLACE(@inputtext, char(13), ' ') -- 'Carriage Return' set @inputtext = REPLACE(@inputtext, char(14), '') -- 'Shift Out' set @inputtext = REPLACE(@inputtext, char(15), '') -- 'Shift In' set @inputtext = REPLACE(@inputtext, char(16), '') -- 'Data Link Escape' set @inputtext = REPLACE(@inputtext, char(17), '') -- 'Device Control 1' set @inputtext = REPLACE(@inputtext, char(18), '') -- 'Device Control 2' set @inputtext = REPLACE(@inputtext, char(19), '') -- 'Device Control 3' set @inputtext = REPLACE(@inputtext, char(20), '') -- 'Device Control 4' set @inputtext = REPLACE(@inputtext, char(21), '') -- 'Negative Acknowledgment' set @inputtext = REPLACE(@inputtext, char(22), '') -- 'Synchronous Idle' set @inputtext = REPLACE(@inputtext, char(23), '') -- 'End of Transmission Block' set @inputtext = REPLACE(@inputtext, char(24), '') -- 'Cancel' set @inputtext = REPLACE(@inputtext, char(25), '') -- 'End of Medium' set @inputtext = REPLACE(@inputtext, char(26), '') -- 'Substitute' set @inputtext = REPLACE(@inputtext, char(27), '') -- 'Escape' set @inputtext = REPLACE(@inputtext, char(28), '') -- 'File Separator' set @inputtext = REPLACE(@inputtext, char(29), '') -- 'Group Separator' set @inputtext = REPLACE(@inputtext, char(30), '') -- 'Record Separator' set @inputtext = REPLACE(@inputtext, char(31), '') -- 'Unit Separator' set @inputtext = REPLACE(@inputtext, char(127), '') -- 'Delete' set @colString = @inputtext WHILE @counter <= DATALENGTH(@colString) BEGIN set @colString = REPLACE(@colString,isnull(NCHAR(UNICODE(SUBSTRING(@colString, @counter, 1))),'|'),'|') set @colString = REPLACE(@colString,'|','') SET @counter = @counter + 1 END return @inputtext END 

Я называю это так:

 BEGIN TRAN --COMMIT ROLLBACK update pmdb.TrackerData set CIRCUIT_COMMENTS = [dbo].[RemoveNonPrintable](CIRCUIT_COMMENTS), COE_COMMENTS = [dbo].[RemoveNonPrintable](COE_COMMENTS), MEETING_NOTES = [dbo].[RemoveNonPrintable](MEETING_NOTES), OSP_COMMENTS = [dbo].[RemoveNonPrintable](OSP_COMMENTS), COE_COMMENTS2 = [dbo].[RemoveNonPrintable](COE_COMMENTS2) 

Затем я запускаю код из предыдущего обновления, чтобы узнать, есть ли разница. Нет никакой разницы. Что дает? Я делаю это неправильно?

ИЗМЕНИТЬ 3

Я обновил свою функцию, чтобы иметь следующее:

  set @colString = @inputtext WHILE @counter <= DATALENGTH(@colString) BEGIN --set @colString = REPLACE(@colString,isnull(NCHAR(UNICODE(SUBSTRING(@colString, @counter, 1))),'|'),'|') --set @colString = REPLACE(@colString,'|','') if (UNICODE(SUBSTRING(@colString, @counter,1)) > 126) BEGIN SET @colString = REPLACE(@colString, CONVERT(nvarchar(1),(SUBSTRING(@colString, @counter,1))), CHAR(32)) END ELSE IF(UNICODE(SUBSTRING(@colString, @counter, 1)) < 32) BEGIN SET @colString = REPLACE(@colString, CONVERT(nvarchar(1),(SUBSTRING(@colString, @counter,1))), CHAR(32)) END set @inputtext = @colString SET @counter = @counter + 1 END 

Он удаляет большинство недопустимых символов, но затем оставляет остальных. Я вызываю его в таблице temp, которую я создал, которая содержит образец недопустимых символов, показанных выше:

 update #Temp set Notes = [dbo].[RemoveNonPrintable](Notes), Notes2 = [dbo].[RemoveNonPrintable](Notes2) 

Затем в двух примечаниях осталось следующее:

 Notes: ????N???u?z?????????)???)?N??????G????>???????)???)?)???????? ????U?????????? ???????)???)?L?)?????????)?????N???N??????? Notes2: ᯸ࢹᖈ 㹨 ⻄ ⸀ )䀤 ) ᛡ ꗘᖃᒨ ᘍ ᐜᏰ>֔ ) ௿ ) )Ἡ ࣆ ᓜ Ꮫ֔Ꮫ֨Ꮫ꯼ᓜ ఍ ఍ ) ) )᯸ࢹ䮸ࣉ᯸ࢹ䮸ࣉ )Ԍ ֐ᕄ ᛙ ꗘᖃᒨ᯸ࢹ 

Что лучше, чем то, с чего я начал, но все еще недостаточно.

Я нашел решение в другом вопросе пользователя здесь

Я немного изменил его. Для меня это работает:

 ALTER FUNCTION [dbo].[RemoveNonASCII] ( -- Parameters @nstring nvarchar(max) ) RETURNS varchar(max) AS BEGIN -- Variables DECLARE @Result varchar(max) = '',@nchar nvarchar(1), @position int -- T-SQL statements to compute the return value set @position = 1 while @position <= LEN(@nstring) BEGIN set @nchar = SUBSTRING(@nstring, @position, 1) if UNICODE(@nchar) between 32 and 127 set @Result = @Result + @nchar set @position = @position + 1 set @Result = REPLACE(@Result,'))','') set @Result = REPLACE(@Result,'?','') END -- Return the result RETURN @Result END 
  • Преобразовать MonthName в месяц Номер SSRS
  • Форматирование цвета SSRS на основе параметра
  • Обновить общий путь к источнику данных всех отчетов SSRS для разных путей
  • C # RDLC Развернуть все / Свернуть все SubReport
  • Как я могу отобразить зеленую ячейку, если результат верен или изображение зеленого робота, когда результат верен в службах отчетов SQL Server
  • СОЮЗУ или НЕ СОЮЗУ
  • SQL Выберите только месяц из формата YYYYMMDD int
  • # Ужасно даже после использования IIF, чтобы избежать деления на нуль в выражении
  • Сброс параметров SSRS при изменении параметра даты
  • SSRS - повторное использование временной таблицы в нескольких наборах данных
  • Выполнить набор данных на основе значения параметра -SSRS
  • Interesting Posts

    Как обновить значение индекса в SQL Server 2008

    Убедитесь, что значение столбца равно нулю. MS SQL Server

    Subsonic 3.0 ActiveRecord с датами

    Как работает setMaxResults (N) в спящем режиме?

    Мой PIVOT возвращает повторяющиеся строки со значениями столбцов в каждой строке

    Как объединить наборы результатов из двух вызовов хранимых процедур?

    вызов функции, определяемой пользователем SQL, в пределах другой пользовательской функции

    Извлечение имен пользователей и идентификаторов пользователей из идентификаторов электронной почты с использованием Ms-SQL

    Как поместить результат одного столбца внутри строковой переменной?

    Создание псевдонима в SQL Server до FROM?

    как проверить, когда был установлен сервер sql

    Есть ли способ разделить результаты запроса выбора на две равные половины?

    Должен ли я создать базу данных SQL Server для использования UNION или избежать ее?

    Возможно несколько шагов на КОГДА НЕ СООТВЕТСТВУЕТ?

    Справка по запросу для голосования в Linq с использованием SQL Server

    Давайте будем гением компьютера.