我从事更多涉及SQL的工作是相当陌生的。

我的目标是使用查询结果通过电子邮件发送电子邮件,以插入电子邮件的创建。我打算在SQL Server 2008上创建一个存储过程,并计划每周两次(最多20封电子邮件,这不会增加电子邮件的负担)。

SELECT ProjectCodes.ProjectCode, COUNT(Projects.ProjectsID),  ProjectApprovers.EmailApprover
FROM Projects
INNER JOIN ProjectCodes
    ON Projects.ProjectCodesID=ProjectCodes.ProjectCodesID
INNER JOIN ProjectApprovers
    ON Projects.ProjectCodesID=ProjectApprovers.ProjectCodesID
WHERE ProjectApprovers.IsPrimaryApprover=1
group by ProjectCodes.ProjectCode, ProjectApprovers.EmailApprover

这将返回类似于以下内容的内容:
+-------------+-------+--------------+
| ProjectCode | Count | EmailAddress |
+-------------+-------+--------------+
| Code1       |     4 | Email1       |
| Code2       |     2 | Email2       |
| Code3       |     2 | Email3       |
| Code4       |     3 | Email4       |
+-------------+-------+--------------+

我想做的基本上是遍历此结果,并运行以下命令:
EXEC msdb.dbo.sp_send_dbmail
@recipients= 'email1',     --email address from above query
@subject='Test email',
@body='You have X projects waiting'    -- where X is the COUNT() term

每行。

我的理解是,如果我使用游标,则可以为每个条目做到这一点,但是我发现所有文档和Stack Overflow结果都强烈表明这不是一个好策略。

做这样的事情的最好方法是什么?

最佳答案

通常,不建议使用游标的原因是因为有一些方法可以不用游标就可以执行所需的操作。许多开发人员都是从过程语言开始的,因此循环是常见且自然的。考虑基于集合的操作不是“自然的”,因此使用游标来模仿循环。

在这种情况下,使用游标是合适的,因为没有基于集合的方法来发送单个电子邮件。

直接从您的数据库服务器发送电子邮件是否是个好主意,这是另一个问题……

关于sql - 如何通过sqlt_prehh生成存储过程中的SQL,但避免使用游标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21557872/

10-10 03:53