删除ASCII扩展字符128(SQL)

时间:2016-03-23 11:30:05

标签: sql sql-server tsql

是否有一种简单的方法可以删除varchar(max)中的扩展ASCII字符。我想从128开始删除所有ASCII字符。例如 - ù,ç,Ä

我已经尝试过这个解决方案并且它不起作用,我认为它是因为它们仍然是有效的ASCII字符?

How do I remove extended ASCII characters from a string in T-SQL?

由于

1 个答案:

答案 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来自我,使用此方法将所有特殊字符替换为安全字符以获取普通拉丁语