如何在存储过程中"迭代"SQL结果但是避免使用游标?

end*_*and 5 sql sql-server stored-procedures sql-server-2008

我更擅长做更多涉及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
Run Code Online (Sandbox Code Playgroud)

这返回类似于:

+-------------+-------+--------------+
| ProjectCode | Count | EmailAddress |
+-------------+-------+--------------+
| Code1       |     4 | Email1       |
| Code2       |     2 | Email2       |
| Code3       |     2 | Email3       |
| Code4       |     3 | Email4       |
+-------------+-------+--------------+
Run Code Online (Sandbox Code Playgroud)

我想做的是基本循环遍历此结果,运行以下内容:

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
Run Code Online (Sandbox Code Playgroud)

对于每一行.

我的理解是,如果我使用游标,我可以对每个条目做一些简单的操作,但是,我发现所有文档和Stack Overflow结果强烈建议这不是一个好策略.

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

D S*_*ley 7

通常不鼓励游标的原因是因为有办法在不使用游标的情况下做你想做的事.许多开发人员从过程语言开始,因此循环是常见且自然的.在基于集合的操作方面的思考不是"自然的",因此游标用于模仿循环.

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

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