[SSRS] 訂閱報表後, 沒有資料時不發Mail

需求:

SQL Server Reporting Service在訂閱報表後會定時產生報表, 並將報表Mail給指定的人員. 但是, 有時後報表查詢結果是沒有資料的 (資料庫內沒有資料). 此時會希望不要發Mail出來.

原理:

由於SQL Server Reporting Service並沒有查無資料時就不發Mail的選項, 所以它做的是定時產生報表(不管有沒有資料), 然後發Mail的指定人員. 所以就必需額外加工來處理.

方法一 (主要由AP人員自行處理):

自已寫個程式, 定時執行 (可使用Windows的排程), 先判斷有沒有資料, 如果沒有資料就結束. 如果有資料, 再呼叫報表程式來產生報表, 然後將報表Mail出去.

方法二(由AP人員與系統人員共同處理):

使用者(AP人員)在訂閱報表後, Reporting Service會在SQL Server的Job中產生一組亂數為名稱的Job, 內容是單純的一句 exec ReportServer2005.dbo.AddEvent @EventType=’TimedSubscription’, @EventData=’85889876-9ff8-49be-be93-fbc05dd34eec’ 的指令. 此時就可以在其前後加上條件判斷式來決定是否執行. 例如:

if exists ( select * from CarServer_DB..V_csvOrders_InvRemind )
begin
exec ReportServer2005.dbo.AddEvent @EventType=’TimedSubscription’, @EventData=’85889876-9ff8-49be-be93-fbc05dd34eec’
end

採用方法二有兩個問題.

1. 執行身份問題, 當執行此exec ReportServer2005.dbo….. 時, 是以SQL Server Reporting Service主機的Network Service (即電腦帳號) 身份執行, 所以可能對要判斷的資料庫表各沒有權限, 所以要記得做授權, 否則 if exists 會失敗

2. 訂閱問題. 當對報表重新訂閱時, 此Job會重置回原來的單一exec ReportServer2005.dbo…. 語法, 所以訂閱內容有改變時, 要再重新加上條件判斷式

3. 判斷問題, 由於Job是以亂數 (有點亂的數字), 所以你無法以 Job 名稱來判斷這到底是屬於哪一支報表的訂閱, 此時你可以用排程來判斷是否是你要執行的報表.

2 回應 to “[SSRS] 訂閱報表後, 沒有資料時不發Mail”

  1. Jacky Says:

    Good Article ! Prefer 方法二 !

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s


%d 位部落客按了讚: