0

私は SQL Server の初心者で、投稿の融合からストアド プロシージャを作成しました。

ストアド プロシージャは次のとおりです。最初のエントリからの日数を使用し、その後変更しないという事実を除けば、すべて正常に機能するため、各電子メールで同じ @numberofdays を取得します。

 ALTER PROCEDURE [dbo].[RenewalsCheck]
 AS
        DECLARE @CompanyName nvarchar (50) = NULL
        DECLARE @ProductKey nvarchar (50) = NULL
        DECLARE @ProductName nvarchar (50) = NULL
        DECLARE @MaintenanceStartDate nvarchar (10) = NULL
        DECLARE @MaintenanceEndDate nvarchar (10) = NULL
        DECLARE @Result nvarchar (10) = NULL
        DECLARE @Emailed int = NULL
        DECLARE @Sent nvarchar (10) = NULL
        DECLARE @Body nvarchar (max) = NULL
        DECLARE @Subject nvarchar (max) = NULL
        DECLARE @SalesManEmail nvarchar (max) = NULL
        DECLARE @NumberOfDays nvarchar (5) = NULL
        DECLARE @FollowUp int = NULL

DECLARE cEMail CURSOR LOCAL FAST_FORWARD FOR

Select 

[CompanyName],
[Product Key],
[Product Name],
[Maintenance Start Date],
[Maintenance End Date],
[Emailed],
[SalesManEmail],
[FollowUp EC Emailed]

FROM dbo.Product

WHERE

datediff(d,GETDATE(),[Maintenance End Date]) < 15 AND [FollowUp EC Emailed]  = '0'

SELECT
@NumberOfDays = datediff(d,GETDATE(),[Maintenance End Date])
FROM dbo.Product
WHERE datediff(d,GETDATE(),[Maintenance End Date]) < 15 AND [FollowUp EC Emailed] = '0'

OPEN cEmail;

WHILE 1 = 1
BEGIN

    FETCH NEXT FROM cEmail INTO @CompanyName, @ProductKey, @ProductName, @MaintenanceStartDate ,@MaintenanceEndDate,
    @Emailed, @SalesManEmail;

    IF @@FETCH_STATUS = -1 BREAK;

    SET @Body = 'The Product ' + @ProductName + ' with a product key of ' + @ProductKey + ' Expires in ' + @NumberOfDays + ' days.'
    SET @Subject = 'Product Expiring in ' + @NumberOfDays + ' at ' + @CompanyName

    EXECUTE msdb.dbo.sp_send_dbmail @profile_name='Jason',
                                    @subject = @Subject,
                                    @recipients = @SalesManEmail,
                                    @copy_recipients ='',
                                    @body = @body;

END

    UPDATE [Product]
    SET [FollowUp EC Emailed] = '1'
    WHERE datediff(d,GETDATE(),[Maintenance End Date]) < 15 AND [FollowUp EC Emailed] = '0'

CLOSE cEmail;
DEALLOCATE cEmail;

セットアップ方法に疑問を持っている方もいらっしゃると思いますが、これを行うためのより良い方法があるかもしれませんが、私は初心者で、1 つの小さなセクションから離れて作業しています。

どんな助けでも大歓迎です。

よろしく

ジェイソン

4

1 に答える 1