想发布上面问题的解决方案,在其他地方问过,但没有信誉点,所以提出了这个问题并同时回答了,因为其他人可能会觉得这个解决方案很有用。:
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前段时间提供。我只是对它进行了调整,使用了更独特的字符,如'†а',而不是'><'