0

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

这是一个特定的示例,其中没有替换愿望字符串MAINTENANCEà ,¿ENHANCED 我尝试了以下但没有成功。

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

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

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

如果 ',' = '‚' print 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,
SQL_VARIANT_PROPERTY(@myVar,'Scale') Scale,
SQL_VARIANT_PROPERTY(@myVar,'TotalBytes') TotalBytes,
SQL_VARIANT_PROPERTY(@myVar,'Collation') Collation,
SQL_VARIANT_PROPERTY(@myVar,'MaxLength') MaxLengths


--**regular comma**
SET @myVar = ','
SELECT SQL_VARIANT_PROPERTY(@myVar,'BaseType') BaseType,
SQL_VARIANT_PROPERTY(@myVar,'Precision') Precisions,
SQL_VARIANT_PROPERTY(@myVar,'Scale') Scale,
SQL_VARIANT_PROPERTY(@myVar,'TotalBytes') TotalBytes,
SQL_VARIANT_PROPERTY(@myVar,'Collation') Collation,
SQL_VARIANT_PROPERTY(@myVar,'MaxLength') MaxLengths

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

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

输出 ——逗号被替换。这是预期的。MAINTENANCEÿENHANCED

但它在我有超过 1 个逗号的情况下不起作用,无论我是从数据源复制它还是自己输入它。('“维护”“增强”)

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

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

输出 ——逗号又回来了。是问题。只有一个(第一个)逗号被替换。AINTENANCE™ 增强型

附言

请参阅下面的答案,我解决了上述所有问题,除了我需要弄清楚如何防止删除特殊字符(如问号、括号等)。

4

1 回答 1

0

部分可以使用下面我从这里得到的代码来解决

 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 %[ ..')

我从 如何从 SQL Server 中的字符串中去除所有非字母字符?

输出 éèàçòMAIN2TENANCEÃÂENHANCED 123 asds

这里的问题是它删除了所有非字母字符串字符,例如 &^?-:;|)?]% ;:_|!"

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

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

于 2020-10-15T18:50:08.353 回答