Как да актуализирате или премахнете всички специални знаци от колона 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. беше, че базата данни трябва да позволява каквито знаци иска потребителят. Всяко филтриране на лоши знаци трябва да се извършва (в софтуера), когато четете стойностите от DB.   -  person dg99    schedule 24.12.2014
comment
Знам това. Няма нищо общо с DB, има всичко, когато се щракне върху връзка за вижте профил и има „&“ в url.   -  person Filling The Stack is What I DO    schedule 24.12.2014
comment
Знам това. Няма нищо общо с DB, има всичко, когато се щракне върху връзка за вижте профил и има „&“ в 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