Вопрос об отправке автоматов c массовых писем на SQL сервер - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть база данных на SQL Сервере с таблицей user с 3 столбцами: имя, дата рождения и адрес электронной почты.

У меня есть хранимая процедура, которая просматривает эту таблицу и ищет, кто У него сегодня день рождения, и он отправляет ему поздравительное письмо, пока оно работает на 100.

Однако я хочу добавить в рамках той же процедуры, что я отправляю электронное письмо всем пользователям базы данных (кроме с днем ​​рождения), уведомив их, что у x человека сегодня день рождения.

Это мой текущий SQL Код сервера:

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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Попробуйте это:

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
0 голосов
/ 04 апреля 2020
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...