我看到 Cade Roux 在我编写实际代码时发布了一些一般性指导。
创建映射表。如果您不需要重音字符替换,则可以不用这样的表。按要求填写,我以200228和131-134为例。
select number,
char(number) original,
case
when number < 128 then char(number)
when number = 200 then 'E'
when number = 228 or number in (131,132,133,134) then 'a'
else ' '
end replacement
into charmap
from master..spt_values
where type='p' and number between 0 and 255
测试表
create table tvc (id int identity, vc nvarchar(100))
insert tvc select 'abcdef'
insert tvc select 'abätest'
insert tvc select 'abÔÖÕüûýèend'
替换查询
update tvc
SET vc = (select cast
((select m.replacement+''
from master..spt_values v
inner join charmap m on m.original=substring(tvc.vc,v.number,1) collate French_BIN
where v.type='P' and v.number between 1 and len(tvc.vc)
order by v.number
for xml path(''), type) as varchar(max)))
注意事项:
- 对直到 nvarchar(2047) 的列使用了一次 spt_values。您可以将它们链接在一起以获得更长的列(最大)
-
collate French_BIN 是为了防止 A 匹配任何带重音的 A 等
- xml type 和转换为 varchar(max) 的复杂包装器用于防止空格变成
&#x20;
不使用charmap并且不需要对重音字符进行特殊处理:
update tvc
set vc = (select cast
((select case when ascii(substring(tvc.vc,v.number,1)) < 128
then substring(tvc.vc,v.number,1)
else ' ' end
from master..spt_values v
where v.type='P' and v.number between 1 and len(tvc.vc)
order by v.number
for xml path(''), type) as varchar(max))) r(new)