REPLACE函数不会替换所需的字符串

问题描述

在创建基于单个表的视图时,我想替换所有出现的特定单个字符串(例如:'^'或',')。但是id不会替换所有数据行中所需的单个字符。查询新创建的视图时,我知道这一点。所有字段都具有varchar数据类型。

这是一个具体示例,其中未替换期望字符串 MAINTENANCE¿ENHANCED 我尝试了以下方法,但都无济于事。

SELECT REPLACE('MAINTENANCE¿ENHANCED',','')
SELECT REPLACE('MAINTENANCE¿ENHANCED',char(33),'')

SELECT REPLACE(N'MAINTENANCE¿ENHANCED',N','')
SELECT REPLACE(CAST('MAINTENANCE¿ENHANCED' as NVARCHAR(50)),'')
SELECT REPLACE(CAST('MAINTENANCE¿ENHANCED' as VARCHAR(50)),'')
SELECT REPLACE(TRY_CAST('MAINTENANCE¿ENHANCED' as VARCHAR(50)),'')
SELECT REPLACE(CONVERT(VARCHAR(50),'MAINTENANCE¿ENHANCED'),'')

我还执行了简单的测试,我从需要替换的地方复制了字符串中的逗号(请参见下面的代码

如果','=','打印1-不返回TRUE。第一个逗号是我在REPLACE函数的第二个参数中键入的逗号,第二个逗号是从上面的字符串中复制的一个逗号。

如果','=','打印1-返回TRUE。我在REPLACE函数的第二个参数中输入的两个逗号。

显然,问题出在数据源中我的逗号被同等对待。尽管下面的函数表明它们都是varchar。 (https://blog.sqlauthority.com/2013/12/15/sql-server-how-to-identify-datatypes-and-properties-of-variable

**-- comma from the string** 
DECLARE @myVar VARCHAR(100)
SET @myVar = '‚'
SELECT sql_VARIANT_PROPERTY(@myVar,'BaseType') BaseType,sql_VARIANT_PROPERTY(@myVar,'Precision') Precisions,'Scale') Scale,'TotalBytes') TotalBytes,'Collation') Collation,'MaxLength') MaxLengths


--**regular comma**
SET @myVar = ','
SELECT sql_VARIANT_PROPERTY(@myVar,'MaxLength') MaxLengths

部分可以使用下面的代码解决

select Stuff('MAINTENANCE¿ENHANCED',PatIndex('%[^a-z0-9]%',1,'')

输出 -逗号已替换。那是预期的。 维护性增强

但是它不起作用,无论我是从数据源复制它还是在我自己键入它,我都有多个逗号。 (',维护保养,增强了')

select Stuff('‚MAINTENANCE¿ENHANCED','‚MAINTENANCE¿ENHANCED'),'')

select  REPLACE(Stuff('‚MAINTENANCE¿ENHANCED',''),'')

输出 -逗号又回来了。这是问题。仅替换一个(第一个)逗号。 增强维护能力

PS

请参考下面的答案,我在其中解决了上述所有问题,除了我需要弄清楚如何避免删除问号,括号等特殊字符。

解决方法

可以使用下面我从这里获得的以下代码来解决此问题

 use MyDB;
go
drop function if exists [dbo].[RemoveNonAlphaCharacters]
go
 Create Function  [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^ a-z0-9]%'
    While PatIndex(@KeepValues,@Temp) > 0
        Set @Temp = Stuff(@Temp,PatIndex(@KeepValues,@Temp),1,'')

    Return @Temp
End

SELECT MyDB.dbo.RemoveNonAlphaCharacters(',(/!:\£&^?-:;|\)?%$"é觰àçò*MAIN,2TENANCE¿ENHANCED 123 asds %[ ..')

我从 How to strip all non-alphabetic characters from string in SQL Server?

输出 éèàçòMAIN2TENANCEÃâENHANCED123 asds

这里会删除所有非字母字符串字符(例如&^?-:; |)的问题? ]%;:_ |!“

我无法解释如何将正则表达式传递给ASCII表可打印部分中的所有字符(除了需要替换的逗号)(请参见上面的示例并点击下面的链接)

https://www.rexegg.com/regex-quickstart.html http://www.asciitable.com/