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

SQL Server中如何根据@CodeMask动态格式化@ClientIDCode字符串

SQL Server根据掩码动态格式化字符串实现方案

核心实现逻辑

  • 从掩码@CodeMask中找到第一个非X的字符作为分隔符,同时计算分隔符后X的数量,即为最终输出中后缀部分的长度
  • 拆分原始编码@ClientIDCode为前后两部分,中间拼接分隔符即可得到结果

兼容全版本SQL Server的实现代码

DECLARE @ClientIDCode varchar(20) = '1000003351', @CodeMask VARCHAR(50) = 'XXX-XXX'
-- 第一步:查找分隔符位置
DECLARE @DelimiterPos INT = PATINDEX('%[^X]%', @CodeMask)
-- 第二步:提取分隔符、计算后缀长度
DECLARE @Delimiter CHAR(1) = SUBSTRING(@CodeMask, @DelimiterPos, 1)
DECLARE @SuffixLength INT = LEN(@CodeMask) - @DelimiterPos
-- 第三步:拼接结果
DECLARE @Result VARCHAR(50) = CONCAT(
    LEFT(@ClientIDCode, LEN(@ClientIDCode) - @SuffixLength),
    @Delimiter,
    RIGHT(@ClientIDCode, @SuffixLength)
)
-- 输出结果
SELECT @Result AS FormattedCode

测试结果验证

对应你给出的三个测试用例,输出结果完全匹配预期:

  • 当@CodeMask = 'XXX-XXX'时,输出为 1000003-351
  • 当@CodeMask = 'XX-XXXX'时,输出为 100000-3351
  • 当@CodeMask = 'XX&XXXX'时,输出为 100000&3351

封装为可复用函数

如果需要批量处理或反复调用,可以封装为标量函数:

CREATE FUNCTION dbo.FormatClientIDCode(
    @ClientIDCode VARCHAR(20),
    @CodeMask VARCHAR(50)
)
RETURNS VARCHAR(50)
AS
BEGIN
    DECLARE @DelimiterPos INT = PATINDEX('%[^X]%', @CodeMask)
    -- 掩码无分隔符时直接返回原始编码
    IF @DelimiterPos = 0 RETURN @ClientIDCode
    DECLARE @Delimiter CHAR(1) = SUBSTRING(@CodeMask, @DelimiterPos, 1)
    DECLARE @SuffixLength INT = LEN(@CodeMask) - @DelimiterPos
    RETURN CONCAT(
        LEFT(@ClientIDCode, LEN(@ClientIDCode) - @SuffixLength),
        @Delimiter,
        RIGHT(@ClientIDCode, @SuffixLength)
    )
END
GO

-- 函数调用示例
SELECT dbo.FormatClientIDCode('1000003351', 'XX&XXXX')

内容的提问来源于stack exchange,提问作者Chirag Patelia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:54:01