Обновить или заменить текст специального символа в поле моей базы данных - PullRequest
0 голосов
/ 17 апреля 2020

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

enter image description here

Как видите, между «master» есть неизвестные символы и 'градус', который я не могу даже вставить здесь.

Я также пытался обновить и заменить его кодом ниже (я не могу вставить эти две вертикальные линии здесь, так как они не поддерживаются ни в одном браузере, и я не точно, что они есть, пожалуйста, посмотрите на картинку выше, чтобы увидеть, что в моем SQL утверждении).

begin transaction
update gm_desc set projdesc=replace(projdesc,'%â  s%','') where projdesc like '%âs%' and proposalno = '15-149-01'

Вы можете увидеть настоящее заявление SQL здесь:

enter image description here

Я пытался обновить или заменить его, но не могу этого сделать. Оператор обновления успешно работает, но я все еще вижу странные специальные чартеры. Буду признателен за помощь.

1 Ответ

3 голосов
/ 17 апреля 2020

Вот скалярная функция, которая удаляет все не алфавитные символы c символов (сохраняет пробелы) из строки.

Надеюсь, это поможет!

dbfiddle

create function dbo.get_alphanumeric_str
(
    @string varchar(max)
)
returns varchar(max)
as
begin

    declare @ret varchar(max);

    with nums as (
        select 1 as n
        union all select n+1 from nums
        where n < 256
    )
    select @ret = replace(stuff(
        (
            select '' + substring(@string, nums.n, 1)
            from nums
            where patindex('%[^0-9A-Za-z ]%', substring(@string, nums.n,1)) = 0 
            for xml path('')
        ), 1, 0, ''
    ), '&#x20;', ' ')
    option (MAXRECURSION 256)

    return @ret;
end

Использование

select dbo.get_alphanumeric_str('Helloᶄ âWorld 1234⅊⅐')

Возвращает: Hello World 1234

Как это работает

  • CTE nums просто получить список чисел (вы можете установить максимальное значение 256 на более высокое значение, если ваши строки длиннее; nb option (MAXRECURSION n) для этого CTE, но должно быть помещено в запрос)
  • The stuff по существу перебирает по строке, используя список чисел выше, и извлекает подстроку длины 1; каждый из этих символов проверяется, соответствуют ли они группе регулярных выражений [^0-9A-Za-z ] (0-9 все цифры, A-Za-z все буквы как в нижнем, так и в верхнем регистре и один символ пробела)
  • Если они совпадают, patindex() должен вернуть 0; т. е. индекс ноль.
  • Используйте replace(string, '&#x20;', ' ') для пробела, так как xml path возвращает специальную кодировку, см. этот вопрос .
  • Используйте двоичное сопоставление для ударения персонажи; см этот ответ
...