如何在SQL Server中移除字符串中符号的第二次出现?
在SQL Server中移除字符串中符号的第二次出现并替换第一个符号
针对你需要将ROUND((#X# + #Y#) / #Z#,2 )转换为ROUND((@X + @Y) / @Z,2 )的需求,本质是把每个#变量#格式的内容替换为@变量——移除变量后的第二个#,同时将第一个#替换为@。以下是两种可行的T-SQL实现方案:
方法1:通用循环处理(支持任意长度变量名)
该方案适用于所有SQL Server版本,能处理单个或多个字符的变量名:
DECLARE @Input NVARCHAR(MAX) = 'ROUND((#X# + #Y#) / #Z#,2 )' DECLARE @Pos INT = PATINDEX('%#%#%', @Input) WHILE @Pos > 0 BEGIN -- 定位当前匹配的第二个#的位置 DECLARE @SecondHashPos INT = CHARINDEX('#', @Input, @Pos + 1) -- 提取#之间的变量名 DECLARE @VarName NVARCHAR(MAX) = SUBSTRING(@Input, @Pos + 1, @SecondHashPos - @Pos - 1) -- 替换#变量#为@变量 SET @Input = STUFF(@Input, @Pos, @SecondHashPos - @Pos + 1, '@' + @VarName) -- 查找下一个匹配的模式 SET @Pos = PATINDEX('%#%#%', @Input) END SELECT @Input AS 处理结果
执行后输出:ROUND((@X + @Y) / @Z,2 )
方法2:JSON拆分拼接(SQL Server 2016+)
借助OPENJSON和STRING_AGG实现更简洁的处理,适合SQL Server 2016及以上版本:
DECLARE @Input NVARCHAR(MAX) = 'ROUND((#X# + #Y#) / #Z#,2 )' SELECT STRING_AGG( CASE WHEN s.ordinal % 2 = 0 THEN '@' + s.value -- 偶数位置的元素是#之间的变量名 ELSE s.value -- 奇数位置的是原字符串中#之外的内容 END, '' ) AS 处理结果 FROM OPENJSON('["' + REPLACE(STRING_ESCAPE(@Input, 'json'), '#', '","') + '"]') s
该方法通过将原字符串按#拆分为JSON数组,遍历数组时对偶数位置的变量名添加@前缀,再重新拼接所有元素得到目标字符串。
内容的提问来源于stack exchange,提问作者dhirendra joshi
相关产品推荐
相关产品推荐

