我们经常需要向所有应用程序用户发送有关各种通知的电子邮件。由于各种原因(垃圾邮件过滤器,策略限制等),我们需要限制在一封电子邮件中发送通知的用户数量。如果电子邮件数量超过给定数量,则需要发送另一封电子邮件。
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;
上面的块给出了我的列表,但是它有人检查有多少用户存在并手动选择后续组的缺陷。
如何在选择所有电子邮件行之前选择所需的行数。
答案 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