在SQL中查找和替换所有特殊字符

12

我想将所有行复制到新列中,并用-替换所有特殊字符。我的代码如下。

我的表格设计

输入图像描述

 select * from mycode
    UPDATE mycode
    SET newName = Replace(myname, '%[^0-9a-zA-Z]%', '-')

我的代码正在被复制,但特殊字符没有被替换。

结果 输入图像描述


2
很遗憾,没有像正则表达式替换这样的东西。希望微软有一天能够添加这个功能... - Giorgi Nakeuri
1
请返回翻译后的文本:这可能有所帮助 https://dev59.com/WXNA5IYBdhLWcg3wVcJx - Sachin
2
好的,没有预装的正则表达式。但是,您可以安装CLR RegEx函数。指南可以在此处找到:https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/ 我通常发现它们非常有用,至少可以替换。 - Evaldas Buinauskas
@t-clausen.uk,您能否在这里为我提供重复的问题链接? - Sunil Acharya
2个回答

12

尝试创建这个函数。

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语句

   UPDATE mycode
    SET newName = dbo.RemoveSpecialChars(mycode)

无法得到结果,你能否在不使用函数的情况下实现这个? - Sunil Acharya
谢谢!这个完美地解决了问题。这个也会移除商标和版权字符吗? - eripey
谢谢,它已经起作用了...在使用之前我进行了编辑以调整它以适应我的需求,因为我仍然使用空格。 - kho dir

6

尝试这个查询

DECLARE @specialchar varchar(15)
DECLARE @getspecialchar CURSOR
SET @getspecialchar = CURSOR FOR
SELECT DISTINCT poschar 
    FROM   MASTER..spt_values S 
           CROSS APPLY (SELECT SUBSTRING(newName ,NUMBER,1) AS poschar from mycode ) t 
    WHERE  NUMBER > 0 

           AND NOT (ASCII(t.poschar) BETWEEN 65 AND 90 
                     OR ASCII(t.poschar) BETWEEN 97 AND 122 
                     OR ASCII(t.poschar) BETWEEN 48 AND 57)

OPEN @getspecialchar 
FETCH NEXT
FROM @getspecialchar INTO @specialchar 
WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE mycode 
        SET newName =Replace(myname,@specialchar,'')
FETCH NEXT
FROM @getspecialchar INTO @specialchar 
END
CLOSE @getspecialchar 
DEALLOCATE @getspecialchar 

Mukesh kalgude:给了你两个投票,但我没有得到结果。 - Sunil Acharya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接