Как обновить или удалить все специальные символы из столбца varchar

Я возился и позволил пользователям создавать названия компаний там, где они создают названия компаний, например: Tom & Marks Ice Cream Shop.

Проблема в том, что в названии компании есть ссылка, по которой другие могут щелкнуть, чтобы увидеть профиль компании, а .net выдает ошибку о том, что опасные символы не допускаются.

Я не беспокоюсь о том, чтобы быть точным с названием компании, пользователь может обновить его самостоятельно, когда каждый раз заметит, что «&» исчез.

Как я могу обновить столбец в SQL с синтаксисом SQL, чтобы удалить все специальные символы и добавить пробел вместо специального символа?

Есть ли способ определить в sql, есть ли в значении столбца специальный символ?

UPDATE [BuildingPros].[utbProfessionals]
   SET [ProfessionalName] = Replace([ProfessionalName],'some character',' ')
 WHERE ProfessionalName =ProfessionalName

person Filling The Stack is What I DO    schedule 24.12.2014    source источник
comment
Я бы исправил базовую проблему опасные символы не разрешены (вы должны описать это), а не изменил данные. При правильном обращении у вас не должно возникнуть проблем   -  person Alex K.    schedule 24.12.2014
comment
Я помещу это утверждение в области, где пользователь впервые создает название своей компании и где он обновляет свое имя, но сейчас мне нужно исправить бу-бу.   -  person Filling The Stack is What I DO    schedule 24.12.2014
comment
@AlexK. Идея заключалась в том, что база данных должна разрешать любые символы, которые хочет пользователь. Любая фильтрация плохих символов должна выполняться (программно) при чтении значений из БД.   -  person dg99    schedule 24.12.2014
comment
Я знаю это. Это не имеет ничего общего с БД, у него есть все, что нужно делать, когда щелкают ссылку просмотра профиля и в URL-адресе есть «&».   -  person Filling The Stack is What I DO    schedule 24.12.2014
comment
Я знаю это. Это не имеет ничего общего с БД, у него есть все, что нужно делать, когда щелкают ссылку просмотра профиля и в URL-адресе есть «&». Сервер не любит URL-адреса со специальными символами. Я знаю, что могу заставить это работать, но я не хочу идти по этому пути, я бы предпочел, чтобы в URL-адресе не было специальных символов.   -  person Filling The Stack is What I DO    schedule 24.12.2014


Ответы (1)


Это пример кода для поиска строки, содержащей специальный символ или нет. Вы можете попробовать этот

DECLARE @MyString VARCHAR(100)
SET @MyString = 'abcdef&&&&ybyds'

IF (@MyString LIKE '%[^a-zA-Z0-9]%')
    BEGIN
       SET @MyString = Replace(@MyString,'&',' ')
       PRINT 'Contains "special" characters'
       PRINT @MyString
  END
ELSE
    BEGIN
       PRINT 'Does not contain "special" characters'
       PRINT @MyString
    END

И ваш запрос UPDATE будет таким: -

UPDATE [BuildingPros].[utbProfessionals]
SET [ProfessionalName] = 
                        (
                         CASE 
                            WHEN [ProfessionalName] LIKE '%[^a-zA-Z0-9]%' 
                                  THEN Replace(REPLACE( ProfessionalName, SUBSTRING( ProfessionalName, PATINDEX('%[~,@,#,$,%,&,*,^,&,%,*,(,)]%', ProfessionalName), 1 ),''),'-',' ')
                            ELSE [ProfessionalName]
                          END
                         )

Или вы можете создать функцию для удаления специальной функции char, а затем вызвать ее в инструкции Update.

1) Удаляет специальные символы из строкового значения. 2) Все символы, кроме 0-9, a-z и A-Z удаляются и 3) возвращаются остальные символы.

 create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256)
       with schemabinding
    begin
       if @s is null
          return null
       declare @s2 varchar(256)
       set @s2 = ''
       declare @l int
       set @l = len(@s)
       declare @p int
       set @p = 1
       while @p <= @l begin
          declare @c int
          set @c = ascii(substring(@s, @p, 1))
          if @c between 48 and 57 or @c between 65 and 90 or @c between 97 and 122
             set @s2 = @s2 + char(@c)
          set @p = @p + 1
          end
       if len(@s2) = 0
          return null
       return @s2
       end

затем вызовите эту функцию в операторе обновления: -

UPDATE [BuildingPros].[utbProfessionals]
SET [ProfessionalName] = 
                   (
                     CASE 
                      WHEN [ProfessionalName] LIKE '%[^a-zA-Z0-9]%' 
                           THEN (SELECT dbo.RemoveSpecialChars(ProfessionalName))
                      ELSE [ProfessionalName]
                      END
                    )

Ссылка

person HaveNoDisplayName    schedule 24.12.2014
comment
Это только для «&», мне это нужно для любого специального символа. - person Filling The Stack is What I DO; 24.12.2014
comment
см. измененный ответ, вы можете включить сюда любой специальный символ - person HaveNoDisplayName; 24.12.2014