0

私は次のことをしようとしています。ユーザーは aspx ページで発行日と期日を入力しています。これらの日付はyyyy/MM/dd、データベースに保存される形式です。

期日の3日前までにユーザーにメールを送信できるようにしたいです。

私が見つけることができた方法は、Windows Serviceまたはを使用していますSQL Jobが、問題は、概念をラップして機能させることができないことです。

紛らわしい部分は、Windows サービス用の新しいプロジェクトを作成する必要があることです。これが正しいかどうかはわかりませんが、私のアプローチは、SQL Server に接続し、課題と期日をデータベースにクエリしてから計算を実行することでした。に保存し、 が次のユーザーにメールを送信するか、ポーリングしない場合resultdateは、 に保存します。resultdateToday's date


編集:

Stored Procedureに設定される を作成することで、上記を達成しようとしていWindows Serviceます。現在、私は次のことに苦労しています。

MS SQL DB含む があり、目標は の前にclosing date別の DB に電子メールがあるユーザーに電子メールを送信することです。2 daysclosing date

次のコードを参照してください。私は使用してCURSOR FORいますが、2 つのコマンド セットをSELECT異なる DB に使用する方法がわかりません。最初のコマンドSELECTはいくつかの変数に格納されており、これらの変数は他の DB から残高データを取得します。

USE ROG
DECLARE @Currentdate varchar(10), @DueDate varchar(10), @Serial_No int, @Product_Line varchar(50), @Email varchar(50)
SET @Currentdate = GETDATE()

DECLARE RFQDate CURSOR FOR

SELECT Serial_No, RFQ_Closing_Date, Product_Line FROM RFQDB WHERE DATEDIFF(day, GETDATE(), RFQ_Closing_Date) = 2

OPEN RFQDate

FETCH NEXT FROM RFQDate INTO @Serial_No, @DueDate, @Product_Line 

WHILE @@FETCH_STATUS = 0

BEGIN 

FETCH NEXT FROM RFQDate INTO @Serial_No, @DueDate, @Product_Line

PRINT ' Due Date ' + @DueDate + ' Serial No ' + coalesce(Convert(varchar(4), @Serial_No),'') + ' Product Line ' + @Product_Line 

END

DECLARE EMAIL CURSOR FOR     --Not sure if this way is correct (this is where I need help!!!

SELECT Sales_Email_ID FROM ProductLineDB WHERE Product_Line = @Product_Line

OPEN EMAIL

FETCH NEXT FROM EMAIL INTO @Email

WHILE @@FETCH_STATUS = 0

BEGIN 

FETCH NEXT FROM EMAIL INTO @Email

PRINT ' EMAIL ' + @Email

END

CLOSE EMAIL

DEALLOCATE EMAIL

CLOSE RFQDate

DEALLOCATE RFQDate

ただし、上記のコードをテストすると、すべての期日が正しく表示されますが、期日に関連付けられたメールは 1 つしか表示されません。代わりに、5 つのメールが表示されます。

MS SQL メッセージ画面

Due Date 2013/02/14 Serial No 1015 Product Line Tubes
Due Date 2013/02/14 Serial No 1015 Product Line Instrumentation
Due Date 2013/02/14 Serial No 1015 Product Line Tooling
Due Date 2013/02/14 Serial No 1015 Product Line Tooling
Due Date 2013/02/14 Serial No 1015 Product Line Tooling
EMAIL xxx@abc.com

正しいコードを編集

次のコードは、必要なすべての情報を取得しています。あとは、スカラー値からsp_send_dbmailを取得するために を実装するだけです。@recipients@Email

The working code is as the following:

USE ROG
DECLARE @Currentdate varchar(10), @DueDate varchar(10), @Serial_No int, @Product_Line varchar(50), @Email varchar(50)
SET @Currentdate = GETDATE()

DECLARE RFQDate CURSOR FOR

SELECT Serial_No, RFQ_Closing_Date, Product_Line FROM RFQDB WHERE DATEDIFF(day, GETDATE(), RFQ_Closing_Date) = 2

OPEN RFQDate

FETCH NEXT FROM RFQDate INTO @Serial_No, @DueDate, @Product_Line 

WHILE @@FETCH_STATUS = 0

BEGIN 

DECLARE EMAIL CURSOR FOR

SELECT Sales_Email_ID FROM ProductLineDB WHERE Product_Line = @Product_Line

OPEN EMAIL

FETCH NEXT FROM EMAIL INTO @Email

PRINT ' EMAIL: ' + @Email

WHILE @@FETCH_STATUS = 0

BEGIN 

FETCH NEXT FROM EMAIL INTO @Email 

END

CLOSE EMAIL

DEALLOCATE EMAIL

FETCH NEXT FROM RFQDate INTO @Serial_No, @DueDate, @Product_Line

PRINT ' Due Date: ' + @DueDate + ' Serial No: ' + coalesce(Convert(varchar(4), @Serial_No),'') + ' Product Line: ' + @Product_Line 

END

CLOSE RFQDate

DEALLOCATE RFQDate
4

1 に答える 1

0

動作するコードは次のとおりです。

USE ROG
DECLARE @Currentdate varchar(10), @DueDate varchar(10), @Serial_No int, @Product_Line varchar(50), @Email varchar(50), @RFQ_No bigint, @Subject nvarchar(500), @Profile_No int, @Body nvarchar(500), @copy_recipients varchar(max) = 'abc@xyz; dfg@xyz'
SET @Currentdate = GETDATE()

DECLARE RFQDate CURSOR FOR

SELECT Serial_No, RFQ_No, RFQ_Closing_Date, Product_Line FROM RFQDB WHERE DATEDIFF(day, GETDATE(),       RFQ_Closing_Date) = 2

OPEN RFQDate

FETCH NEXT FROM RFQDate INTO @Serial_No, @RFQ_No, @DueDate, @Product_Line 

WHILE @@FETCH_STATUS = 0

BEGIN 

DECLARE EMAIL CURSOR FOR

SELECT Profile_No, Sales_Email_ID FROM ProductLineDB WHERE Product_Line = @Product_Line

OPEN EMAIL

FETCH NEXT FROM EMAIL INTO @Profile_No, @Email

PRINT ' EMAIL: ' + @Email + ' | Profile No: ' + coalesce(Convert(varchar(4), @Profile_No),'')

WHILE @@FETCH_STATUS = 0

BEGIN 

FETCH NEXT FROM EMAIL INTO @Profile_No, @Email 

END

CLOSE EMAIL

DEALLOCATE EMAIL

FETCH NEXT FROM RFQDate INTO @Serial_No, @RFQ_No, @DueDate, @Product_Line

SET @Subject = ' Profile No: ' + coalesce(Convert(varchar(4), @Profile_No),'') + ' | RFQ No: ' +  coalesce(Convert(nvarchar(10), @RFQ_No),'') + ' | Due Date: ' + @DueDate 

SET @Body = 'The following ' + ' RFQ No: ' +  coalesce(Convert(nvarchar(10), @RFQ_No),'') + ' is due on date: ' + @DueDate 

PRINT ' Due Date: ' + @DueDate + ' | Serial No: ' + coalesce(Convert(varchar(4), @Serial_No),'') + ' | Product Line: ' + @Product_Line 

PRINT @Body

PRINT @Subject

IF @Email != ''
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name = '31BM',
@importance = 'High',
@recipients = @Email,
@copy_recipients = @copy_recipients,
@subject = @Subject,
@body = @Body;
END
ELSE
PRINT 'No Email to send'
END

CLOSE RFQDate

DEALLOCATE RFQDate

上記は最終的な作業コードであり、私はSQL SERVER AGENTこのジョブを1日あたりに実行するために使用することにしました。

お役に立てば幸いです。

于 2013-02-12T20:21:41.487 に答える