【问题标题】:Question about sending automatic bulk mail in SQL Server关于在 SQL Server 中发送自动批量邮件的问题
【发布时间】:2020-04-04 02:46:56
【问题描述】:

我在 SQL Server 中有一个数据库,其中有一个 user 表,其中包含 3 列:姓名、出生日期和电子邮件。

我有一个存储过程,它会遍历这个表来寻找今天过生日的人,并向他发送一封祝贺电子邮件,到目前为止它的工作时间是 100。

但是,我想在向数据库的所有用户(生日除外)发送电子邮件的同一过程中添加,通知他们 x 人今天过生日。

这是我当前的 SQL Server 代码:

CREATE PROCEDURE spSendEmail
AS
    DECLARE @email nvarchar(128)
    DECLARE @name  nvarchar(128)
    DECLARE @Date  date

    SELECT 
        GETDATE(), 
        MONTH(GETDATE()), DAY(GETDATE()), YEAR(GETDATE())

    DECLARE email_cursor CURSOR FOR 
        SELECT u.name, u.email
        FROM dbo.users u
        WHERE MONTH(u.dateofbirth) = MONTH(GETDATE())
          AND DAY(u.dateofbirth) = DAY(GETDATE()) 

    OPEN email_cursor

    FETCH NEXT FROM email_cursor INTO @name, @email

    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT @email

        DECLARE @subject nvarchar(255)
        DECLARE @Bodytext nvarchar(512)

        SET @BodyText = @Name + '' + 'we wish you happy birthday'
        SET @Subject = 'Happy Birthday' 

        EXEC msdb.dbo.sp_send_dbmail
                      @profile_name = 'Birthday Alert',
                      @recipients = @email,
                      @body = @Bodytext,
                      @subject = @subject;

        FETCH NEXT FROM email_cursor INTO @name, @email
    END 

    CLOSE email_cursor
    DEALLOCATE email_cursor

【问题讨论】:

  • 您只需将 where 子句更改为 not(month... and day... )
  • 让我们重新表述一下这种方法!我想将重要的个人信息泄露给可能认识或不认识某些人的陌生人。这些特定个人也没有要求或同意此类个人信息的泄露。在您考虑如何执行此操作之前,请考虑您是否应该执行此操作。
  • 此过程适用于小型组织。他们并不陌生

标签: sql-server stored-procedures sql-server-2017


【解决方案1】:
CREATE PROCEDURE spSendEmail AS
DECLARE @email nvarchar(128)
DECLARE @name  nvarchar(128)
DECLARE @Date  date
DECLARE @Num_Users_Having_Birthday varchar(100) = (SELECT COUNT(*) FROM dbo.users WHERE MONTH(u.dateofbirth) = MONTH(GETDATE())
      AND DAY(u.dateofbirth) = DAY(GETDATE()))

SELECT 
    GETDATE(), 
    MONTH(GETDATE()), DAY(GETDATE()), YEAR(GETDATE())

DECLARE email_cursor CURSOR FOR 
    SELECT u.name, u.email
    FROM dbo.users u
    WHERE MONTH(u.dateofbirth) <> MONTH(GETDATE())
      AND DAY(u.dateofbirth) <> DAY(GETDATE()) 

OPEN email_cursor

FETCH NEXT FROM email_cursor INTO @name, @email

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @email

    DECLARE @subject nvarchar(255)
    DECLARE @Bodytext nvarchar(512)

    SET @BodyText = @Name
    SET @Subject = 'Number of People having Birthday today:' + @Num_Users_Having_Birthday

    EXEC msdb.dbo.sp_send_dbmail
                  @profile_name = 'Birthday Alert',
                  @recipients = @email,
                  @body = @Bodytext,
                  @subject = @subject;

    FETCH NEXT FROM email_cursor INTO @name, @email
END 

CLOSE email_cursor
DEALLOCATE email_cursor

【讨论】:

    【解决方案2】:

    试试这个:

    CREATE PROCEDURE spSendEmail
    AS
    BEGIN
        DECLARE @email nvarchar(128)
        DECLARE @name  nvarchar(128)
        DECLARE @has_birthday BIT
        DECLARE @Date  date
        DECLARE @birthday_boys INT -- update this to 
    
        SELECT 
            GETDATE(), 
            MONTH(GETDATE()), DAY(GETDATE()), YEAR(GETDATE())
    
        IF(OBJECT_ID('tempdb..users') IS NOT NULL)
            DROP TABLE #users;
    
        -- For Sql Server version >= 2016: DROP TABLE IF EXISTS #users
    
        SELECT u.name, u.email
            , IIF(MONTH(u.dateofbirth) = MONTH(GETDATE()) AND DAY(u.dateofbirth) = DAY(GETDATE()),1,0) has_birthday 
        INTO #users
        FROM dbo.users u
    
        --Get all birthday boys list
    
        SELECT  @birthday_boys = COUNT(u.name)
        FROM #users u
        WHERE has_birthday = 1
    
        DECLARE email_cursor CURSOR FOR 
            SELECT u.name, u.email, u.has_birthday
            FROM #users
        OPEN email_cursor
    
        FETCH NEXT FROM email_cursor INTO @name, @email, @has_birthday
    
        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @email
    
            DECLARE @subject nvarchar(255)
            DECLARE @Bodytext nvarchar(512)
    
            SET @BodyText = IIF(@has_birthday = 1, @Name + '' + 'we wish you happy birthday', CONCAT('Birthday boys'' count is ', @birthday_boys))  
            SET @Subject = IIF(@has_birthday = 1, 'Happy Birthday', 'Birthday Boys'' Count') 
    
            EXEC msdb.dbo.sp_send_dbmail
                          @profile_name = 'Birthday Alert',
                          @recipients = @email,
                          @body = @BodyText,
                          @subject = @subject
    
    
            FETCH NEXT FROM email_cursor INTO @name, @email
        END 
    
        CLOSE email_cursor
        DEALLOCATE email_cursor
    
        IF(OBJECT_ID('tempdb..users') IS NOT NULL)
            DROP TABLE #users;
        -- For Sql Server version >= 2016: DROP TABLE IF EXISTS #users
    
    END
    

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2023-03-07
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多