问题描述
在创建基于单个表的视图时,我想替换所有出现的特定单个字符串(例如:'^'或',')。但是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/