【问题标题】:How to update or remove all special characters from a varchar column如何更新或删除 varchar 列中的所有特殊字符
【发布时间】:2014-12-24 17:48:07
【问题描述】:

我搞砸了,允许用户在他们创建公司名称的地方创建公司名称,例如:Tom & Marks Ice Cream Shop。

问题是公司名称有一个链接供其他人点击查看公司简介,.net 抛出错误,指出不允许使用危险字符。

我不担心公司名称的精确性,用户可以在每次注意到“&”消失时自行更新。

如何使用 SQL 语法将 SQL 中的列更新为删除所有特殊字符并在特殊字符位置添加空格?

有没有办法在sql中识别列值中是否有特殊字符?

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

【问题讨论】:

  • 我会修复底层的危险字符是不允许的。 问题(你应该描述这个)而不是更改数据。如果处理得当,您应该不会遇到问题
  • 我会将该声明放在用户第一次创建公司名称和更新名称的区域,但现在,我需要修复 boo boo。
  • @AlexK. 的观点是数据库应该允许用户想要的任何字符。当您从数据库中读取值时,应该(在软件中)对“坏字符”进行任何过滤。
  • 我知道这一点。它与 DB 无关,当单击查看配置文件链接并且 url 中有一个“&”时,它会做所有事情。
  • 我知道这一点。它与 DB 无关,当单击查看配置文件链接并且 url 中有一个“&”时,它会做所有事情。服务器不喜欢带有特殊字符的网址。我知道我可以让它工作,但我不想走那条路,我宁愿 url 中没有特殊字符。

标签: sql sql-server database tsql special-characters


【解决方案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
                         )

或者您可以创建一个函数来删除特殊字符函数,然后在 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
                    )

Refer

【讨论】:

  • 这仅适用于'&',任何特殊字符都需要它。
  • 查看修改后的答案,您可以在此处包含任何特殊字符
猜你喜欢
  • 1970-01-01
  • 2019-09-21
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多