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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:36:29