如何用SQL自动生成全量分组的分号分隔邮件列表
自动批量分组生成邮件收件人列表的SQL方案
你的问题太常见了——手动调整序号范围来分批生成邮件收件人不仅麻烦,还容易漏选或者重复。我们可以通过自动按固定数量分组+组内拼接邮箱的方式彻底解决这个问题,让SQL帮你搞定所有批次的收件人列表,不用再手动统计和修改。
核心思路
- 先给所有用户邮箱分配连续序号(和你原来的思路一致);
- 根据序号计算每个邮箱所属的分组(每99个为一组);
- 按分组拼接邮箱字符串,自动生成所有需要的邮件收件人列表。
方案1:SQL Server 2017及以上版本(推荐)
从SQL Server 2017开始支持STRING_AGG函数,拼接字符串非常简洁高效:
WITH EmailList AS ( SELECT ROW_NUMBER() OVER(ORDER BY Email) AS Seq, Email FROM ApplicationUser ) SELECT -- 计算分组编号,每99个邮箱一组,编号从1开始 CEILING(Seq / 99.0) AS GroupNumber, -- 拼接组内邮箱,用分号分隔 STRING_AGG(Email, ';') AS RecipientList FROM EmailList GROUP BY CEILING(Seq / 99.0) ORDER BY GroupNumber;
方案2:SQL Server 2016及以下版本
如果你的数据库版本不支持STRING_AGG,可以用FOR XML PATH的经典方式实现字符串拼接:
WITH EmailList AS ( SELECT ROW_NUMBER() OVER(ORDER BY Email) AS Seq, Email FROM ApplicationUser ), GroupedEmails AS ( SELECT -- 用整数除法计算分组,(Seq-1)确保第一组从0开始 (Seq - 1) / 99 AS GroupNumber, Email FROM EmailList ) SELECT GroupNumber + 1 AS GroupNumber, -- 把分组编号改成从1开始,更直观 STUFF( (SELECT ';' + Email FROM GroupedEmails g2 WHERE g2.GroupNumber = g1.GroupNumber FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '' -- 去掉开头多余的分号 ) AS RecipientList FROM GroupedEmails g1 GROUP BY GroupNumber ORDER BY GroupNumber;
关键细节说明
- 分组计算:
(Seq - 1) / 99或者CEILING(Seq / 99.0)都能实现每99个一组,前者分组从0开始,后者从1开始,你可以根据习惯调整; - 排序:
ORDER BY Email保证每次分组的顺序一致,避免重复或遗漏收件人; - 分隔符:这里用分号
;作为邮箱分隔符,你可以根据邮件系统的要求改成逗号或其他符号。
运行以上代码后,会自动输出所有分组的收件人列表,每组最多99个邮箱,完全不需要手动干预啦!
内容的提问来源于stack exchange,提问作者Rahul Misra
相关产品推荐
相关产品推荐

