首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server : DBMail存储过程

SQL Server : DBMail存储过程
EN

Stack Overflow用户
提问于 2013-07-23 18:16:20
回答 1查看 115关注 0票数 0

我是SQL Server的新手,我已经通过合并posts创建了一个存储过程。

下面是这个存储过程--它工作得很好,除了它使用从第一个条目开始的天数,并且以后不会改变它,所以我对每封电子邮件都得到了相同的@numberofdays。

代码语言:javascript
复制
 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;

我知道你们中的一些人会质疑它是如何设置的,并且可能有更好的方法来做到这一点,但我是新手,它正在从一个很小的部分工作。

任何帮助都是非常感谢的。

问候

杰森

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-23 18:23:08

问题是在游标循环之外设置了一次天数

您可以通过添加一个case字段将其包含在游标查询中,如下所示:

代码语言:javascript
复制
Select 
[CompanyName],
[Product Key],
[Product Name],
[Maintenance Start Date],
[Maintenance End Date],
[Emailed],
[SalesManEmail],
[FollowUp EC Emailed],
case when datediff(d,GETDATE(),[Maintenance End Date]) < 15 AND [FollowUp EC Emailed] = '0' datediff(d,GETDATE(),[Maintenance End Date]) end NumberDays
FROM dbo.Product

您还需要将@NumberOfDays的赋值添加到FETCH NEXT

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17807342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档