You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:35:20