2013-04-13 79 views
0

我正在開發一個應用程序,我需要將電子郵件發送給表中的所有用戶。由於用戶數量以百萬計,所以一次選擇所有用戶將無濟於事。有什麼辦法可以用20或30個用戶組發送電子郵件,以便下一次能夠動態選擇下20個用戶併發送電子郵件。任何幫助將不勝感激。如何從sql數據庫中的表中取出下一條記錄

+0

「下一步」按什麼順序?如果你想定義「下一個」和「前一個」,你必須**有一個明確的排序('ORDER BY(somecolumn)')定義 –

+0

我希望你沒有創建一個垃圾郵件製造程序。 ;)用戶表中的條目是否有任何順序? ID,CreatedAtDate什麼的? – Corak

+0

表中有未被排序的客戶ID。任何幫助如何實現這一點。謝謝 –

回答

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 
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 

確保刪除臨時表。

+0

如果有人在發送電子郵件的同時向UserProfile表中添加更多行,則很可能有人會收到2封電子郵件。 –

+0

@ Peter Henell -i已將UserName更改爲UserEmail。由於這是userprofile表,它不可能有2個用戶具有相同的電子郵件地址。所以,我不認爲有人會因爲擁有相同的電子郵件地址而收到2封電子郵件。但還有另一個問題。在發送電子郵件的過程中,可能會創建新用戶,並且由於我們在查詢中使用了訂單號,因此某些用戶可能會收到多封電子郵件,而有些用戶可能無法收到。爲了解決這個問題,我們可以在數據庫中使用標記來標記哪些郵件成功發送,並且在發送所有電子郵件之後,爲所有用戶設置標記爲false。 –

相關問題