如何在Microsoft SQL Server 2016中仅保留字符串允许的字符?
在SQL Server 2016中移除不在允许列表中的所有字符
当明确知道要移除的字符时,嵌套REPLACE函数确实能快速解决问题,但要保留指定字符(比如字母、数字、空格、点号、冒号)并移除其他所有字符,SQL Server 2016没有内置的正则替换函数(REGEXP_REPLACE要到2017及以后版本才支持),可以用以下几种方案:
方案1:递归CTE临时处理
不需要创建额外对象,适合一次性清理需求:
DECLARE @InputString NVARCHAR(MAX) = 'String with characters like #§$ I do not want to keep'; DECLARE @AllowedChars NVARCHAR(100) = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :.'; WITH RecursiveClean AS ( SELECT 1 AS Position, CASE WHEN CHARINDEX(SUBSTRING(@InputString, 1, 1), @AllowedChars) > 0 THEN SUBSTRING(@InputString, 1, 1) ELSE '' END AS CleanedString UNION ALL SELECT rc.Position + 1, rc.CleanedString + CASE WHEN CHARINDEX(SUBSTRING(@InputString, rc.Position + 1, 1), @AllowedChars) > 0 THEN SUBSTRING(@InputString, rc.Position + 1, 1) ELSE '' END FROM RecursiveClean rc WHERE rc.Position < LEN(@InputString) ) SELECT TOP 1 CleanedString AS Result FROM RecursiveClean ORDER BY Position DESC;
逻辑:从字符串第一个字符开始递归遍历,逐个检查字符是否在允许列表中,符合条件就追加到结果字符串,最终得到清理后的内容。
方案2:自定义标量函数复用逻辑
如果需要多次执行清理操作,把逻辑封装成函数更方便:
CREATE FUNCTION dbo.CleanStringToAllowedChars(@InputString NVARCHAR(MAX), @AllowedChars NVARCHAR(100)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @CleanedString NVARCHAR(MAX) = ''; DECLARE @Position INT = 1; WHILE @Position <= LEN(@InputString) BEGIN IF CHARINDEX(SUBSTRING(@InputString, @Position, 1), @AllowedChars) > 0 BEGIN SET @CleanedString += SUBSTRING(@InputString, @Position, 1); END SET @Position += 1; END RETURN @CleanedString; END;
调用示例:
SELECT dbo.CleanStringToAllowedChars( 'String with characters like #§$ I do not want to keep', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :.' ) AS Result;
逻辑:用循环遍历输入字符串的每个字符,只保留在允许列表中的字符,最后返回清理后的字符串。
方案3:CLR函数(性能优先)
如果你的SQL Server环境允许启用CLR,可以编写CLR函数调用.NET的正则替换功能,性能比递归和循环更好,尤其适合处理长字符串。核心是用C#实现类似Regex.Replace(input, @"[^a-zA-Z0-9 :.]", "")的逻辑,然后部署到SQL Server中作为自定义函数使用。不过需要注意提前开启CLR支持,并确保有相关权限。
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

