SQL脚本问题:姓名字段转分段随机字符失败,求修改方案
问题解决:让姓名每个部分对应独立随机串
原脚本的核心问题是子查询里加了TOP 1——它只取了STRING_SPLIT拆分后的第一个姓名片段,所以不管原姓名有几部分,最终只会生成一个随机字符串,完全达不到你的要求。另外原脚本里两次调用NEWID()也会导致截取逻辑不稳定,建议统一生成一次再处理。
修改后的完整脚本(兼容所有SQL Server版本)
DECLARE @NewNames TABLE (ID INT, Name NVARCHAR(MAX)); INSERT INTO @NewNames (ID, Name) SELECT ID, ( -- 给每个拆分后的姓名片段生成一个随机串,后面加空格 SELECT LEFT(CONVERT(VARCHAR(255), NEWID()), CHARINDEX('-', CONVERT(VARCHAR(255), NEWID())) - 1) + ' ' FROM STRING_SPLIT(Name, ' ') FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') AS NewName FROM dbo.[user]; -- 去掉拼接后末尾多余的空格 UPDATE @NewNames SET Name = LEFT(Name, LEN(Name) - 1) WHERE RIGHT(Name, 1) = ' '; UPDATE u SET u.Name = nn.Name FROM dbo.[user] u JOIN @NewNames nn ON u.ID = nn.ID;
关键修改点
- 删掉子查询里的
TOP 1,让拆分出的每个姓名片段都生成对应的随机字符串 - 每个随机串后面加空格,保证多个片段之间用空格分隔开
- 多一步处理去掉末尾的多余空格,避免姓名最后留个空尾巴
如果你的SQL Server是2017及以上版本,用STRING_AGG会更简洁,不用额外处理空格:
DECLARE @NewNames TABLE (ID INT, Name NVARCHAR(MAX)); INSERT INTO @NewNames (ID, Name) SELECT ID, -- 直接把每个片段的随机串用空格拼接起来 STRING_AGG(LEFT(CONVERT(VARCHAR(255), NEWID()), CHARINDEX('-', CONVERT(VARCHAR(255), NEWID())) - 1), ' ') FROM dbo.[user] CROSS APPLY STRING_SPLIT(Name, ' ') GROUP BY ID; UPDATE u SET u.Name = nn.Name FROM dbo.[user] u JOIN @NewNames nn ON u.ID = nn.ID;
这个版本逻辑更清晰,一步到位完成拼接,不用再处理末尾空格。
内容的提问来源于stack exchange,提问作者Andrey Smith
相关产品推荐
相关产品推荐

