-1

我面临无法更新或替换数据库中某些字符的问题。以下是我检索该文本时在我的专栏中的样子:

在此处输入图像描述

如您所见,“master”和“degree”之间有一个未知字符,我什至无法将其粘贴到此处。

我还尝试更新并用下面的代码替换它(我不能在此处粘贴那两条垂直线,因为它们不受任何浏览器支持,我不确定它们是什么,请参阅上图以查看我的 SQL 语句中的内容)。

begin transaction
update gm_desc set projdesc=replace(projdesc,'%â  s%','') where projdesc like '%âs%' and proposalno = '15-149-01'

你可以在这里看到真正的 SQL 语句:

在此处输入图像描述

我试图更新或替换它,但我做不到。更新声明成功运行,但我仍然看到奇怪的特殊章程。我会很感激帮助我。

4

1 回答 1

3

这是一个标量值函数,它从字符串中删除所有非字母数字字符(保留空格)。

希望它有帮助!

小提琴手

create function dbo.get_alphanumeric_str
(
    @string varchar(max)
)
returns varchar(max)
as
begin

    declare @ret varchar(max);

    with nums as (
        select 1 as n
        union all select n+1 from nums
        where n < 256
    )
    select @ret = replace(stuff(
        (
            select '' + substring(@string, nums.n, 1)
            from nums
            where patindex('%[^0-9A-Za-z ]%', substring(@string, nums.n,1)) = 0 
            for xml path('')
        ), 1, 0, ''
    ), '&#x20;', ' ')
    option (MAXRECURSION 256)

    return @ret;
end

用法

select dbo.get_alphanumeric_str('Helloᶄ âWorld 1234⅊⅐')

回报:Hello World 1234

这个怎么运作

  • numsCTE 只是为了获取数字列表(如果您的字符串较长,您可以将最大值设置为256更高的值;nboption (MAXRECURSION n)用于此 CTE,但必须放在查询中)
  • stuff本质上是遍历字符串,使用上面的数字列表并提取长度为 1 的子字符串;检查每个字符是否与[^0-9A-Za-z ]正则表达式组匹配(0-9所有数字、A-Za-z所有小写和大写字母以及单个空格字符)
  • 如果它们匹配,patindex()则应返回 0;即索引零。
  • 用于replace(string, '&#x20;', ' ')空格字符作为xml path返回特殊编码,请参阅此问题
  • 对重音字符使用二进制排序规则;看到这个答案
于 2020-04-17T02:28:47.183 回答