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

数据库列字符串同长度随机字符替换问题及脚本缺陷

解决SQL替换字符串为同长度随机字符的问题

你的需求是将数据库列中的字符串替换为同长度的随机字符(保留空格位置和长度),但现有脚本无法保证替换后长度与原字符串一致,问题出在原脚本的随机片段截取逻辑上。

原脚本的问题

原脚本通过STRING_SPLIT按空格拆分字符串后,用NEWID()截取第一个横杠前的8位字符再聚合。这种方式会导致每个拆分后的单词被替换成固定8位的随机串,完全忽略了原单词的实际长度,最终结果的总长度自然和原字符串不一致。

正确的解决方案(SQL Server)

下面的脚本通过递归CTE逐个处理原字符串的每个字符,严格保留原字符串的长度和空格位置,仅将非空格字符替换为随机字母或数字:

WITH CharCTE AS (
    SELECT 
        id,
        Name,
        1 AS Position,
        CASE 
            WHEN SUBSTRING(Name, 1, 1) = ' ' THEN ' '
            ELSE CHAR(CASE WHEN RAND(CHECKSUM(NEWID())) > 0.5 THEN 48 + FLOOR(RAND(CHECKSUM(NEWID()))*10) ELSE 65 + FLOOR(RAND(CHECKSUM(NEWID()))*26) END)
        END AS RandomChar
    FROM dbo.[user]
    WHERE LEN(Name) >= 1
    UNION ALL
    SELECT 
        id,
        Name,
        Position + 1,
        CASE 
            WHEN SUBSTRING(Name, Position + 1, 1) = ' ' THEN ' '
            ELSE CHAR(CASE WHEN RAND(CHECKSUM(NEWID())) > 0.5 THEN 48 + FLOOR(RAND(CHECKSUM(NEWID()))*10) ELSE 65 + FLOOR(RAND(CHECKSUM(NEWID()))*26) END)
        END AS RandomChar
    FROM CharCTE
    WHERE Position < LEN(Name)
)
SELECT 
    id,
    Name AS OriginalName,
    STRING_AGG(RandomChar, '') WITHIN GROUP (ORDER BY Position) AS NewName
FROM CharCTE
GROUP BY id, Name
ORDER BY id;

逻辑说明

  1. 递归CTE CharCTE 遍历原字符串的每一个字符位置
  2. 对每个字符做判断:如果是空格则直接保留;否则随机生成大写字母(A-Z)或数字(0-9)
  3. 最后通过STRING_AGG按字符位置聚合所有随机字符,得到与原字符串长度完全一致、空格位置不变的结果

扩展调整

如果需要支持小写字母,可以修改CHAR()的ASCII范围:

  • 小写字母的ASCII码是97-122,把ELSE 65 + ...改成ELSE CASE WHEN RAND(CHECKSUM(NEWID())) > 0.5 THEN 65 + FLOOR(RAND(CHECKSUM(NEWID()))*26) ELSE 97 + FLOOR(RAND(CHECKSUM(NEWID()))*26) END即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:48:23