[英]How to perform an action on one result at a time in a sql query return that should return multiple results?
我正在尝试向数据库中符合特定描述的所有地址发送电子邮件。 我的查询将如下所示:
SELECT EmailAddress
FROM Customers`
WHERE EmailFlag = 'true'`
AND (Today'sDate - DateOfVisit) >= 90;
不知道我会怎么做今天的日期 - DateOfVisit,也许你也可以帮忙?
我真正的问题是如何将这个查询的结果从顶部弹出一个电子邮件地址,用它来发送电子邮件,将它的标志设置为 false,再次运行查询重复直到查询返回 null。
在此先感谢您的帮助!
使用循环遍历查询结果。
SELECT EmailAddress
FROM Customers`
WHERE EmailFlag = 'true'`
AND DATEDIFF(day, GETDATE(),DateOfVisit) >= 90;
将天替换为您想要获得差异的其他单位,例如秒、分钟等。
C#:
foreach(DataRow dr in queryResult.Tables[0].Rows)
{
string email = dr["EmailAddress"].ToString();
// Code to send email
//Execute Query UPDATE Customers SET EmailFlag = False WHERE EmailAddress = email
}
这只是一个草案。 您应该用实际代码替换注释以使其工作。 无需从您的初始查询中一次获取 1 个结果。
对于日期,请使用DATEDIFF()
和GETDATE()
或GETUTCDATE()
等函数。
SELECT EmailAddress
FROM Customers`
WHERE EmailFlag = 'true'`
AND DATEDIFF(day, GETDATE(),@dateOfVisit) >= 90;
现在要获取电子邮件地址,您可以使用任何 ORM,或者您可以使用 ADO.NET 编写自己的 DAL。 根据我的经验,我建议使用dapper
。 它使用简单且非常高效。
在这种情况下,您只需要:
string email = connection.Query<string>("your_proc_name", new { dateOfVisit = dateOfVisit }, commandType: System.Data.CommandType.StoredProcedure).First();
//now write another proc to reset the flag
比较日期的正确方法是这样的:
WHERE
DateOfVisit < dateadd(day, -90, getdate())
此脚本将发送邮件,您需要配置一个配置文件:
DECLARE @sendto varchar(max)
SET @sendto = STUFF((
SELECT ';' + [EmailAddress ]
FROM Customers
WHERE DateOfVisit < dateadd(day, -90, cast(getdate() as date))
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') [values]
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'profile name you need to configure',
@blind_copy_recipients = @sendto,
@body = 'Body text',
@subject = 'Subject text';
这不是sargable ,应该避免:
DATEDIFF(day, @dateOfVisit, GETDATE()) >= 90;
我发现在 sql 中有一个SELECT LIMIT
语句这样的东西,它允许你指定你想要一次返回多少结果。 它可能看起来像这样:
SELECT expressions
FROM tables
[WHERE conditions]
[ORDER BY expression [ ASC | DESC ]]
LIMIT number_rows [ OFFSET offset_value ];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.