Как найти недопустимый символ Char в таблице SQL
За последние пару недель это была серьезная головная боль. У меня довольно большой стол (165 колонок x 11000+ строк). В этой таблице есть несколько столбцов комментариев, которые установлены в varchar(max)
. Существует, в частности, тот, который продолжает получать недопустимые символы, вставленные в него различными пользователями. Это приводит к сбою отчетов в SSRS. Затем мне нужно найти эти недопустимые символы и удалить их. Это была очень кропотливая трудоемкая задача.
То, что я хотел бы сделать, это найти способ автоматического поиска этих недопустимых символов и заменить их ничем. Проблема в том, что я понятия не имею, как искать поиск непосредственно для этих персонажей. Вот как они выглядят:
- Динамически хранить и отправлять отчеты SSRS в формате PDF с помощью C #
- Создайте набор данных SSRS, который запрашивает данные, зависящие от результатов из хранимой процедуры, которая создает таблицу Temp для хранения результатов?
- Задайте значение параметра SSRS Report Parameter с переданным значением Querystring в SSRS
- Как я могу заставить мои источники данных SSRS / наборы данных работать параллельно?
- Как указать, что значение НЕ МЕНЕЕ в параметре
и вот еще один образ того же:
И вот как это выглядит, когда я вставляю его в Notepad ++:
Я не уверен, что это сработает и покажет, как я его вижу, но вот персонажи:
㹊 潮 Ņࢹᖈư 㹨 ¯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: ࢹᖈ 㹨 ⻄ ⸀ )䀤 ) ᛡ ꗘᖃᒨ ᘍ ᐜᏰ>֔ ) ) )Ἡ ࣆ ᓜ Ꮫ֔Ꮫ֨Ꮫᓜ ) ) )ࢹ䮸ࣉࢹ䮸ࣉ )Ԍ ᕄ ᛙ ꗘᖃᒨࢹ
Что лучше, чем то, с чего я начал, но все еще недостаточно.
- SSRS объединяет и объединяет два отчета в один отчет
- Отладка отчета не работает, показывая сообщение об ошибке «Убедитесь, что предоставлены достаточные разрешения» Как решить эту проблему?
- Epicor 10 (ERP) Ошибка отчетности SSRS: максимум 1024 столбца возвращены
- Перемещение только подписки с SSRS 2008 на SSRS 2012
- Несколько гипер-ссылок в одной ячейке в отчете SSRS
- Цвет клиента в выражении IIF -SSRS
- Определение отчета имеет недопустимое целевое пространство имен rsInvalidReportDefinition
- Нарушение отчета SSRS в зависимости от параметра Multi Value
Я нашел решение в другом вопросе пользователя здесь
Я немного изменил его. Для меня это работает:
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