1

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    


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

特定の部門の最終合計額が計算された後にレポートを分割し、次の部門の ID に対して次のレポートを生成する必要があります。

任意の提案や説明!!

4

1 に答える 1

0

XML 電子メール レポートを連結することは SQL Server の設計目的ではないため、SQL Server 内でビジネス上の政治的制約が生じていると思います。

個人的には、サービスの実行可能ファイル (Windows サービス、またはタスク スケジューラによって呼び出される単なるコンソール アプリケーションなど) とコード (C# など) を使用します。

  1. その部門だけのレポートを取得するために、divisionId パラメータを渡して、SQL Server からデータだけを取得します。

  2. XML テンプレート ファイルを開き、データを挿入します。

  3. SQL Server からその部門のユーザーのリストを要求し、リスト内の各人に電子メールを送信します。

  4. 部門ごとに繰り返します。

ループを使用して、ストアドプロシージャだけでこれを行うことができると言った。カーソルを使用することもできますが (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
于 2012-09-15T11:06:26.517 に答える