在组中构建以分号分隔的电子邮件列表

时间:2018-05-25 15:29:37

标签: sql sql-server

我们经常需要向所有应用程序用户发送有关各种通知的电子邮件。由于各种原因(垃圾邮件过滤器,策略限制等),我们需要限制在一封电子邮件中发送通知的用户数量。如果电子邮件数量超过给定数量,则需要发送另一封电子邮件。

DECLARE @emails varchar(max)
with EmailList AS
(
    SELECT row_number() over(order by email) as Seq, 
    Email from ApplicationUser
)
select @emails = COALESCE(@emails + ';', ' ') +  email from EmailList where seq between 1 and 99;

上面的块给出了我的列表,但是它有人检查有多少用户存在并手动选择后续组的缺陷。

如何在选择所有电子邮件行之前选择所需的行数。

1 个答案:

答案 0 :(得分:3)

在SQL 2017中,您可以使用string_agg()

select string_agg(email, ';')
from (select row_number() over(order by email) as seqnum, au.*
      from ApplicationUser au
     ) au
group by (seqnum - 1) / 100;

在早期版本中,您需要使用XML执行此操作:

with e as (
      select (row_number() over(order by email) - 1) / 100 as grp,
             au.*
      from ApplicationUser au
     ) 
select stuff( (select ';' + email
               from e
               where e.grp = g.grp
               for xml path ('')
              ), 1, 1, ''
             ) as emails
from (select distinct grp from e) g