2015-12-03 60 views
0

我有兩列是'Name'和'PayDay'。'Payday'是日期類型,'Name'是nvarchar。我不知道在他/她的發薪日到來前兩天,我能否收到一封人名姓名的電子郵件。例如'姓名'是約翰和'發薪日'是12.5.2015。我需要在10.5.2015中收到一封包含姓名'約翰'的電子郵件。我做了一項研究,發現觸發器是一個很好的選擇。我可以爲觸發器和郵件服務提供任何建議。謝謝。SQL在日期到來之前發出警告

+1

在SQL代理+代碼+日常工作,我不知道什麼是關於觸發器......他們只在修改(INSERT,UPDATE,DELETE)數據 – Simone

+1

你觸發應設置一個代理作業,以便在給定時間每天查詢表格,並在兩天之後發送具有發薪日的電子郵件名稱 – Raj

回答

2

我們也有類似的情況,我們在預計完成日期之前通知百分比進度。我認爲觸發器不會成爲你正在尋找的解決方案。

在我們的例子中,我開發了一個簡單的存儲過程來讀取所有的表值,預計在x天內完成。然後,我使用這個select並將結果連接成一個參數。如果這個長度大於0,那麼我發送了電子郵件。

收發郵件我使用的代碼是:

EXEC msdb.dbo.sp_send_dbmail 
@profile_name='SQLMail',       -- Your email profile name here 
@recipients'[email protected]omain.com;[email protected];',-- Recipients emails 
@subject='Projects nearing completion',   -- Subject line 
@[email protected]        -- String built above 

有很多很好的導遊對電子郵件在那裏,包括所有的設置。

爲了執行此操作,我從SQL服務器代理運行它,並將其安排在午夜後運行。這意味着我總是會收到一封新郵件,但我每天只收到一封電子郵件。如果您嘗試通過觸發器執行此操作,則每次寫入表時都會收到一封電子郵件。

如果您有任何進一步的問題,請給我留言,我會看看我可以做些什麼來幫助。

2
DECLARE @t TABLE(
    Name NVARCHAR(50), 
    PayDay DATE 
) 

INSERT INTO @t (Name, PayDay) 
VALUES (N'Jonh 1', '20151203'), (N'Jonh 2', '20151201') 

DECLARE @date DATE = DATEADD(DAY, 2, GETDATE()) 

IF EXISTS(SELECT 1 FROM @t WHERE PayDay = @date) BEGIN 

    DECLARE @recipients NVARCHAR(MAX) 
    SELECT @recipients = STUFF((
     SELECT ', ' + Name 
     FROM @t 
     WHERE PayDay = @date 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, CONVERT(VARCHAR(10), @date) + ':') 

    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = '[email protected]', 
     @subject = 'caption', 
     @body = @recipients 

END 

數據庫郵件上面