电子邮件作业计划程序查询以生成每日报告

时间:2012-09-15 10:19:31

标签: sql-server sql-server-2008 tsql

  
    

我有一个作业调度程序,假设根据20个不同的部门向20个不同的id发送每日收集报告。每个部门仅收到该特定部门的1份报告。这是我提出的查询。

  
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)


SET @xml = CAST((select tm.name as 'td','',h.name as 'td','',h.account_number AS 'td','', 
SUM(bc.total_amount)  AS 'td'  
FROM MJP.dbo.tbl_bank_collection bc,  
MJP.dbo.tbl_div_type_master tm,  
MJP.dbo.tbl_div_header h  
where   bc.type_id = tm.id    
and bc.header_id = h.id    
and bc.transaction_date = '06-12-2012'   
and bc.div_id in ( select d.id    
from tbl_div d, tbl_bank_collection bc    
where bc.div_id = d.id    
group by d.id)    
group by tm.name, h.name,h.account_number with rollup    
having grouping(h.name) = 1 or    
GROUPING(h.account_number) = 0     
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))   
SET @body ='<html><i>Collection Report</i>    
<body bgcolor=red><table border = 1><tr><th>Type Name    
<th>Header Name</th><th>Account Number</th>    
<th>Total Amount</th></tr>'     
SET @body = @body + @xml +'</table></body></html>'   
EXEC msdb.dbo.sp_send_dbmail    
@profile_name='alkesh mail',    
@body_format ='HTML',    
@recipients='id.no1@yahoo.com;id.no2@yahoo.com',    
@subject='Daily Report',    
@body=@body    


----------------------------------------------------------------------------------------

现在我想在计算一个特定的divison的最终总金额之后拆分报告,并且应该为下一个部门的id生成下一个报告。

任何建议或澄清!!

1 个答案:

答案 0 :(得分:0)

我假设商业政治让你在SQL Server中受到限制,因为连接XML电子邮件报告 是SQL Server的设计目标。

我个人会有一个服务可执行文件(Windows服务,或者只是一个由任务调度程序调用的控制台应用程序,无论如何。),代码(例如C#):

  1. 获取只是 SQL Server的数据格式,传递一个divisionId参数来获取只是该分区的报告。

  2. 打开XML模板文件并插入数据。

  3. 从SQL Server请求该部门的用户列表,并通过电子邮件发送列表中的每个人。

  4. 重复每个部门。

  5. 说完所有你可以用存储过程,使用循环来做到这一点。你可以使用游标(yuck)但我总是喜欢这些结构:(注意。在RDBMS中循环是真的要避免的,这在很大程度上取决于你的具体情况)

    declare @divisionId int = (select min(divisionId) from tbDivisions)
    declare @userId int = ( min(userId) from users where divisionId = @divisionId )
    declare @xml nvarchar(max)
    
    while divisionId is not null
    begin
        exec your_report_stored_procedure @division = @divisionId, output @xml = @xmlOut
    
        while @userId is not null
        begin
            exec your_email_tored_procedure @userId = @userId, @xmlIn = @xml
            select @userId = min(userId) from users where divisionId = @divisionId and userId > @userId
        end
    
        select @divisionId = min(divisionId) from tbDivisions where divisionId > @divisionId
    end