如何从T-SQL中的字符串中删除除Carrage Return和Line Feed之外的扩展ASCII字符



想发布上面问题的解决方案,在其他地方问过,但没有信誉点,所以提出了这个问题并同时回答了,因为其他人可能会觉得这个解决方案很有用。:

CREATE FUNCTION [dbo].[u_FN_CleanString](@string VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
;
WITH DummyTable(DummyColumn) AS (SELECT 1
FROM   (VALUES (1),(1),(1),(1),(1),(1),(1),(1)) DummyTable(DummyColumn))
-- ASCII 0-31 (join 5 times: 2->4->8->16->32 rows)
,   Unprintables(Chrctr)    AS (SELECT TOP(32) CHAR(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1)
FROM   DummyTable a,DummyTable b,DummyTable c,DummyTable d,DummyTable e
UNION
-- ASCII 128-255 (join 7 times: 2->4->8->16->32->64->128 rows)
SELECT TOP(128) CHAR(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))+127)
FROM   DummyTable a,DummyTable b,DummyTable c,DummyTable d,DummyTable e,DummyTable f,DummyTable g)
-- Remove extended ASCII characters
SELECT @string=REPLACE(@string,Chrctr,'')
FROM   Unprintables
-- Do not replace Carriage Returns or Line Feeds
WHERE  Chrctr NOT IN (CHAR(10),CHAR(13))
RETURN RTRIM(@string)
END

注释太长

只是一些需要考虑的事情。您的函数可能会产生意外/不希望的结果。

假设您有一个字符串'Red{tab}{tab}{tab}hat',那么您的函数将返回'Redhat'

因此,与其使用破坏性较小的@string=REPLACE(@string,Chrctr,'')(注意空间(,不如使用破坏性较低的@string=REPLACE(@string,Chrctr,' ')

然后我们进行最后的清理,以删除重复空间

Return ltrim(rtrim(replace(replace(replace(@string,' ','†‡'),'‡†',''),'†‡',' ')))

返回的值将是'Red hat'

全面披露:清理方法由Gordon前段时间提供。我只是对它进行了调整,使用了更独特的字符,如'†а',而不是'><'

最新更新