是否有一种简单的方法可以删除varchar(max)中的扩展ASCII字符。我想从128开始删除所有ASCII字符。例如 - ù,ç,Ä
我已经尝试过这个解决方案并且它不起作用,我认为它是因为它们仍然是有效的ASCII字符?
How do I remove extended ASCII characters from a string in T-SQL?
由于
答案 0 :(得分:3)
链接的解决方案正在使用一个循环,如果可能的话,这是你应该避免的。
我的解决方案是完全可以内联的,因此很容易创建一个UDF(或者甚至更好:内联TVF)。
这个想法:创建一组正在运行的数字(这里它受到sys.objects中对象数量的限制,但是有大量示例如何动态创建数字计数器)。在第二个CTE中,字符串被分成单个字符。最后的选择带回清洁的字符串。
DECLARE @tbl TABLE(ID INT IDENTITY, EvilString NVARCHAR(100));
INSERT INTO @tbl(EvilString) VALUES('ËËËËeeeeËËËË'),('ËaËËbËeeeeËËËcË');
WITH RunningNumbers AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nmbr
FROM sys.objects
)
,SingleChars AS
(
SELECT tbl.ID,rn.Nmbr,SUBSTRING(tbl.EvilString,rn.Nmbr,1) AS Chr
FROM @tbl AS tbl
CROSS APPLY (SELECT TOP(LEN(tbl.EvilString)) Nmbr FROM RunningNumbers) AS rn
)
SELECT ID,EvilString
,(
SELECT '' + Chr
FROM SingleChars AS sc
WHERE sc.ID=tbl.ID AND ASCII(Chr)<128
ORDER BY sc.Nmbr
FOR XML PATH('')
) AS GoodString
FROM @tbl As tbl
结果
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Here is another answer来自我,使用此方法将所有特殊字符替换为安全字符以获取普通拉丁语