【问题标题】:Sending Email using Sql server 2012 in single mail使用 Sql server 2012 在单个邮件中发送电子邮件
【发布时间】:2015-01-27 18:43:05
【问题描述】:

我正在尝试使用 Sql server 2012 中的存储过程发送邮件。

可以使用我编写的代码发送邮件。

我得到的输出

例如,如果我的表中有 5 行,那么每一行都被视为一封邮件。 我收到了 5 封邮件,包含 5 条不同的记录。

示例

邮件 1

EmpName: Abc

EmpId : 123

邮件 2

企业名称:xyz

EmpId : 456

邮件 3

企业名称:定义

EmpId : 789

实际要求

我希望在一封邮件中发送所有 5 行。

示例

邮件 1

EmpName: Abc

EmpId : 123

企业名称:xyz

EmpId : 456

企业名称:定义

EmpId : 789

这是我写的存储过程:

DECLARE 
@out_desc VARCHAR(1000),
@out_mesg VARCHAR(10)

DECLARE @EmpName VARCHAR(20),
@LoginDate datetime,
@EmailId NVARCHAR(max),
@EmpID NVARCHAR(50),
@Salary NVARCHAR(50),
@MonthName NVARCHAR(50)

DECLARE @body NVARCHAR(1000)
DECLARE @subject NVARCHAR(500)

DECLARE C1 CURSOR READ_ONLY
FOR

select EmpName,EmpID,SUM(SalaryToBePaid) as Salary,
(select EmailId from EmailIds) as EmailId,
( SELECT DATENAME(MM, GETDATE())) as MonthName 
from EmployeeSalary
where 
LoginDate between DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -3) and GETDATE()     
Group By
EmpName,EmpID

OPEN C1
FETCH NEXT FROM C1 INTO 
@EmpName,@EmpID,@Salary,@EmailId,@MonthName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @body = '<b><U>Employees :</U></b><br />'  +
     '<br/><b>Employee Name     :   '  + @EmpName + 
     '<br/><b>Employee Id       :     '  + @EmpID +  
   + '<br/><b>Salary : '  + @Salary     
   SET @subject = @MonthName  + '    Month Salary Details'                  
    EXEC sp_send_mail --sp_send_mail 
    'xxx@mail.com', --- add your Email Address here
    'password',       ----add your Password here

    @EmailId,
    @subject,        
    @body,
    'htmlbody', @output_mesg = @out_mesg output, @output_desc = @out_desc    output

    PRINT @out_mesg
    PRINT @out_desc

FETCH NEXT FROM C1 INTO 
@EmpName, @EmpID, @Salary,@EmailId,@MonthName
END

CLOSE C1
DEALLOCATE C1

请帮帮我..

【问题讨论】:

  • sp_send_mailsp_send_dbmail 不适用于生成和发送报告。这就是 Reporting Services 的工作。它们旨在向管理员发送警报。格式化、收件人管理、调度几乎是不可能的。您使用了错误的工具来完成这项工作。

标签: sql-server sendmail


【解决方案1】:

移除光标。只需使用 SELECT RATHER 光标。这会给你带来好的结果。

下面是一个例子,用你自己的替换

DECLARE @bodyMsg nvarchar(max)
DECLARE @subject nvarchar(max)
DECLARE @tableHTML nvarchar(max)

SET @subject = 'Query Results in HTML with CSS'


SET @tableHTML = N'<table id="box-table" >' +
N'<tr><font color="Green"><th>SpecialOfferID</th>
<th>Description</th>
<th>Type</th>
<th>Category</th>
<th>StartDate</th>
<th>EndDate</th>
</tr>' +
CAST ( ( 

SELECT td = CAST([SpecialOfferID] AS VARCHAR(100)),'',
td = [Description],'',
td = [Type],'',
td = [Category] ,'',
td = CONVERT(VARCHAR(30),[StartDate],120) ,'',
td = CONVERT(VARCHAR(30),[EndDate],120) 
FROM [AdventureWorks].[Sales].[SpecialOffer]    
ORDER BY [SpecialOfferID]
FOR XML PATH('tr'), TYPE 
) AS NVARCHAR(MAX) ) +
N'</table>' 

【讨论】:

  • 我试过你的代码,我得到了错误。它说“错误至少需要一个收件人,但没有找到”。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多