我正在开发一个应用程序,我需要将电子邮件发送给表中的所有用户。由于用户数以百万计,因此一次选择所有用户不会有任何好处。有什么方法可以让我在一组 20 或 30 个用户中发送电子邮件,以便下次动态选择接下来的 20 个用户并发送电子邮件。任何帮助将不胜感激。
问问题
379 次
2 回答
1
如果您使用的是 SQL Server 2005 或更高版本,则可以使用 Row_Number() 来获取所需的用户数。
例子:
Select * from (Select *, Row_number()over (order by UserEmail) as Row from Userprofile) T
Where T.Row Between 30 and 40
但是,如果您使用的是 SQL Server 2000,则没有像 Row_Number() 这样的东西。您将不得不使用 IDENTITY() 函数和一个临时表。
例子:
SELECT IDENTITY(int, 1,1) AS RowNumber, UserEmail INTO #temp
FROM Userprofile ORDER BY UserEmail ASC
SELECT * FROM #Temp Where #Temp.RowNumber Between 10 and 20 ORDER BY RowNumber DROP TABLE #Temp
确保删除临时表。
于 2013-04-13T10:49:51.280 回答
0
创建一个新表EmailReceivers,在其中填写您希望发送到的所有电子邮件地址。然后从该表中选择前 30 个,一旦您完成发送电子邮件,您就从该表中删除该记录。当桌子是空的时,你就完成了。
create table EmailReceivers
(
Id bigint identity(1, 1) primary key clustered,
EmailAddress varchar(5000)
)
-- Now fill this table with all the email addresses
insert EmailReceivers(EmailAddress)
select Email from users....
-- Select top 30 to send
select top 30 Id, EmailAddress from EmailReceivers order by Id
-- When done sending, delete the receiver from the table
delete EmailReceivers where id = @id
执行这么多的删除操作可能会影响性能,因此您可能希望分块删除。为此,请删除您之前选择的所有行。只需从该批次中获取最高 ID 并删除 ID 低于或等于该 ID 的所有行。
delete EmailReceivers where id <= @maxIdFromLastBatch
于 2013-04-13T08:09:17.153 回答