sql server将特殊字符替换为null

sql server将特殊字符替换为null,sql,sql-server,netezza,Sql,Sql Server,Netezza,我无法替换特殊字符。你能帮我一下吗 我的意见是: Mrs঩Montero 输出应为: Mrs Montero 特殊字符未正确显示。请看下图。 从中,您可以创建如下函数: create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256) with schemabinding begin if @s is null return null declare @s2 varchar

我无法替换特殊字符。你能帮我一下吗

我的意见是:

Mrs঩Montero
输出应为:

Mrs Montero
特殊字符未正确显示。请看下图。

从中,您可以创建如下函数:

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
Create Function RemoveSpecialCharacters (@text nvarchar(max))
Returns varchar(4000)
AS
BEGIN
Declare @Return varchar(4000) = Cast(@text as varchar(4000))

While PatIndex('%[^a-z ]%', @Return) > 0
        Set @Return = Stuff(@Return, PatIndex('%[^a-z ]%', @text), 1, ' ')

Return @Return
END

Select RemoveSpecialCharacters(textct) from mytable

如果只需选择,请执行以下操作:

Select Replace(textct, Special_char, ' ')
from mytable
如果要更新,请执行以下操作:

Update mytable
Set textct = Replace(textct, Special_char, ' ')
Select Replace(cast(textct as varchar),cast(Special_char as varchar), ' ')
from mytable
假设这些是NVARCHAR,则执行以下操作:

Update mytable
Set textct = Replace(textct, Special_char, ' ')
Select Replace(cast(textct as varchar),cast(Special_char as varchar), ' ')
from mytable
如果要删除所有特殊字符,需要使用如下函数:

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
Create Function RemoveSpecialCharacters (@text nvarchar(max))
Returns varchar(4000)
AS
BEGIN
Declare @Return varchar(4000) = Cast(@text as varchar(4000))

While PatIndex('%[^a-z ]%', @Return) > 0
        Set @Return = Stuff(@Return, PatIndex('%[^a-z ]%', @text), 1, ' ')

Return @Return
END

Select RemoveSpecialCharacters(textct) from mytable
你可以

select 
    textct,
    replace(textct collate Latin1_General_BIN, nchar(2473), ' ')
from
    mytable
创建此函数:

CREATE function RemoveSpecialCharacters(@Temp nvarchar(4000))
returns varchar(4000)
as
BEGIN
  DECLARE @KeepValues as varchar(100)
  -- you can add more characters like hyphen if you also want to keep those
  SET @KeepValues = '%[^A-Z0-9 ]%'
  WHILE PatIndex(@KeepValues, @Temp) > 0
    SET @Temp = Stuff(@Temp, PatIndex(@KeepValues, 1, ' ')
  RETURN @Temp
END
现在可以替换字符了

SELECT dbo.RemoveSpecialCharacters('abc!"¤# ?123')
结果:

abc      123

尽管您复制/粘贴的代码会删除特殊字符,但它也会删除连字符
-
,这是连字符名称中的有效字符,因此可能不是最佳解决方案。您复制的代码只是删除任何不是A-Z或0-9的内容。我想它也会删除空格,但我想不会desirable@Tanner:-事实上,我想要获得通用解决方案,OP必须添加更多的范围和检查,以转义那些特殊字符,如连字符。否则,如果有一些特定的特殊字符,那么使用
replace
函数也很好。您可以编写一个sql函数来删除所有非字符值(或者您也需要数字吗?)为什么要标记netezza?netezza被标记是因为。。我的来源是sql server,目标是netezza。如果我们能在netezza处理。那太好了。嗨,克里斯,你的假设是正确的。这是一个nvarchar列。源具有多个NLS代码页。几个例子:Mrs঩蒙特罗先生቙嫁贝尔。。。像希伯来语,英国拉丁语。当我尝试在replace命令中复制粘贴特殊字符时,符号正在更改。所以无法替代。如果我们将nvarchar转换为varchar,则有可能更改有效的NLS字符。我只需要更换঩ 是的,这就是转换为varchar所要做的。它将不再允许那些特殊的角色,因此它将恢复঩ 字符并替换它。因此,如果您只是执行一个selectreplace(cast(textct作为varchar),那么是的঩', ' ') 然后希望你能看到一些快乐。祝你好运!我需要所有的特殊角色,除了঩'. 因为它是一个nvarchar列。我的更新底部的函数应该有帮助,你也可以在这里找到类似的内容:你的函数只返回前30个字符