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

SQL Server存储过程中格式化字符串:为指定名称添加HTML加粗标签

嘿,完全没必要用游标来做这个!游标是逐行处理的老办法,效率低还麻烦,SQL Server里用集合式的操作就能轻松搞定,而且性能好得多。我给你两个实用的方案,你可以根据自己的场景选:

方案1:嵌套REPLACE动态SQL(适合名称数量不多的场景)

这个思路是把所有需要加粗的名称从表中取出来,自动生成一串嵌套的REPLACE语句,一次性完成所有替换,比游标快太多了。

假设你的函数生成的字符串存在变量@inputString里,存储要加粗名称的表叫TargetNames,列名是NameToBold,代码示例如下:

DECLARE @inputString NVARCHAR(MAX) = '这里是要处理的字符串:Leone G, Thompson JC, 还有Smith A.';
DECLARE @replaceSql NVARCHAR(MAX);

-- 自动生成嵌套的REPLACE语句,注意转义单引号避免语法错误
SELECT @replaceSql = STRING_AGG(
    N'REPLACE(' + COALESCE(@replaceSql, N'@inputString') + N', ''' + REPLACE([NameToBold], '''', '''''') + N''', ''<b>' + REPLACE([NameToBold], '''', '''''') + N'</b>'')',
    N''
)
FROM [TargetNames]
WHERE [NameToBold] IS NOT NULL; -- 过滤空值

-- 如果有需要替换的名称,执行替换;否则直接返回原字符串
IF @replaceSql IS NOT NULL
BEGIN
    EXEC sp_executesql @replaceSql, N'@inputString NVARCHAR(MAX) OUTPUT', @inputString OUTPUT;
END

-- 输出处理后的结果
SELECT @inputString AS FormattedString;

小提示:如果存在名称互相包含的情况(比如同时有Leone和Leone G),记得给TargetNames的查询加个排序:ORDER BY LEN([NameToBold]) DESC,先替换更长的名称,避免短名称先被替换导致长名称匹配失败。

方案2:递归CTE逐次替换(不想用动态SQL的场景)

如果你对动态SQL有顾虑,或者名称数量较多,用递归CTE逐行替换也是个不错的选择,它不需要拼接SQL语句,纯集合操作完成:

DECLARE @inputString NVARCHAR(MAX) = '这里是要处理的字符串:Leone G, Thompson JC, 还有Smith A.';

WITH NameReplaceCTE AS (
    -- 初始行:原字符串 + 第一个要替换的名称
    SELECT 
        1 AS RowNum,
        @inputString AS CurrentString,
        [NameToBold]
    FROM [TargetNames]
    WHERE [NameToBold] IS NOT NULL
    UNION ALL
    -- 递归逻辑:每次替换一个名称,逐步更新字符串
    SELECT 
        nrc.RowNum + 1,
        REPLACE(nrc.CurrentString, tn.[NameToBold], '<b>' + tn.[NameToBold] + '</b>') AS CurrentString,
        tn.[NameToBold]
    FROM NameReplaceCTE nrc
    JOIN [TargetNames] tn ON tn.[NameToBold] = (
        SELECT [NameToBold] 
        FROM [TargetNames] 
        WHERE [NameToBold] IS NOT NULL
        ORDER BY LEN([NameToBold]) DESC -- 同样优先替换长名称
        OFFSET nrc.RowNum ROWS FETCH NEXT 1 ROW ONLY
    )
)
-- 取最后一次替换完成的结果
SELECT TOP 1 CurrentString AS FormattedString
FROM NameReplaceCTE
ORDER BY RowNum DESC;
额外注意事项
  • 要是名称里包含HTML特殊字符(比如&、<、>),记得先转义这些字符,不然会破坏HTML结构,比如用REPLACE([NameToBold], '&', '&amp;')来处理&。
  • 如果你的名称数量特别多(比如上万条),上面两种方法可能会有性能瓶颈,这时候可以考虑写个CLR自定义函数来处理,不过一般业务场景下前两种方法完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:51:45