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
相关产品推荐
相关产品推荐

