Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从MS SQL自动发送生日电子邮件_Sql Server_Database_Stored Procedures - Fatal编程技术网

Sql server 从MS SQL自动发送生日电子邮件

Sql server 从MS SQL自动发送生日电子邮件,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,我创建了一个名为Customers的表,其中包含以下列: ID Name 出生日期 电子邮件 Manager 条目 Name Birthdate Email Manager ---- ---------- -------------- ------- Jan 1986-05-15 jan@gmail.com None Koos 1986-07-24 Koos@gmail.com 1 Sam 1991-07-24 Sam@gmail.com

我创建了一个名为
Customers
的表,其中包含以下列:

  • ID
  • Name
  • 出生日期
  • 电子邮件
  • Manager
  • 条目

    Name  Birthdate   Email           Manager
    ----  ----------  --------------  -------
    Jan   1986-05-15  jan@gmail.com   None
    Koos  1986-07-24  Koos@gmail.com  1
    Sam   1991-07-24  Sam@gmail.com   1
    
    这意味着库斯和山姆的经理是简

    现在我想做的是确定某人今天是否有生日

    Create PROCEDURE [dbo].[EmailData]
    
    AS
    SET NOCOUNT ON
    BEGIN
    Declare @Date date
    
    SELECT GETDATE(), Month(GetDate()), Day(GetDate()), Year(GetDate())
    
    select
           a.ID, a.Name,      
            a.BirthDate as EmpBirthday,
        b.Name as Manager, 
            b.Email as ManEmail
        from dbo.Customers  a
            inner join dbo.Customers b
            on a.Manager = b.ID
    where Month(a.BirthDate) = Month(GetDate())
        and Day(a.BirthDate) = Day(GetDate())
    
    END
    Go
    
    上面的工作很好,我得到了我想要的100%的结果

    我现在想做的是将今天生日的每位员工的电子邮件发送给员工的经理

    我想到了这个,但它似乎不起作用,我不知道为什么:

    Create PROCEDURE EmailData
    
    AS
    BEGIN
    
    Declare @email             nvarchar(128)
    Declare @Date              date
    
    SELECT GETDATE(), Month(GetDate()), Day(GetDate()), Year(GetDate())
    
    DECLARE rcpt_cursor CURSOR FOR 
    select 
           b.Email
           from dbo.Customers  a
           inner join dbo.Customers b
           on a.Manager = b.ID
    where Month(a.BirthDate) = Month(GetDate())
          and Day(a.BirthDate) = Day(GetDate())
    
    OPEN rcpt_cursor
    
    FETCH NEXT FROM rcpt_cursor INTO @email
    
    DECLARE @ServerAddr nvarchar(128)
    Set @ServerAddr = 'smtp.gmail.com'
    
    DECLARE @From nvarchar(128)
    Set @From = 'My Email Address'
    
    DECLARE @Bodytext nvarchar(512)
    Set @BodyText = 'Your Employees have a birthday today.'
    
    DECLARE @User nvarchar(128)
    Set @User = 'My Email Address'
    
    DECLARE @Password nvarchar(128)
    Set @Password = 'My Password'
    
    DECLARE @SSL int
    Set @SSL = 0
    
    DECLARE @Port int
    Set @Port = 587
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT @email
    DECLARE @subject nvarchar(255)
    SELECT @Subject = 'Happy Birthday' +  @email
    EXEC EmailData @ServerAddr, 
        @from, @email, @subject, @BodyText, @User, @Password, @SSL, @Port
    FETCH NEXT FROM rcpt_cursor
    INTO @email
    END
    CLOSE rcpt_cursor
    DEALLOCATE rcpt_cursor
    
    End
    Go 
    
    任何帮助都将不胜感激。

    好的,我破解了它

    首先,我建立了一个数据库邮件帐户

    然后我写了一个程序

    USE [Customers]
    GO
    
    SET ANSI_NULLS ON
    
    GO
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    ALTER PROCEDURE [dbo].[usp_SendEmail]
    
    AS
    
    Declare @email        nvarchar(128)
    Declare @name         nvarchar(128)
    Declare @Date         date
    
    SELECT GETDATE(), Month(GetDate()), Day(GetDate()), Year(GetDate())
    
    DECLARE rcpt_cursor CURSOR FOR 
    select
           a.Name,
           b.Email 
        from dbo.Customers  a
            inner join dbo.Customers b
            on a.Manager = b.ID
    where Month(a.BirthDate) = Month(GetDate())
        and Day(a.BirthDate) = Day(GetDate())
    
    OPEN rcpt_cursor
    
    FETCH NEXT FROM rcpt_cursor
    
    
    INTO @name,@email
    
    WHILE @@FETCH_STATUS = 0
    
    BEGIN
    PRINT @email
    Declare @subject nvarchar(255)
    Declare @Bodytext nvarchar(512)
    
    Set @BodyText = @Name + '' + ' has a birthday today. Please congrad him'
    Set @Subject = 'Employee Birthday' 
    
    exec msdb.dbo.sp_send_dbmail
    @Profile_Name = 'HappyBirthday',
    @Recipients = @email,
    @Body = @BodyText,
    @Subject = @Subject
    
    FETCH NEXT FROM rcpt_cursor
    INTO @name,@email
    
    
    END 
    
    CLOSE rcpt_cursor
    
    DEALLOCATE rcpt_cursor
    
    Go 
    
    Exec [usp_SendEmail]
    

    该过程现在通过hole customer表运行,检查是否有那么多的生日日期,并将电子邮件发送给员工有生日的经理。

    因此,如果“经理”为空,则以下带1的行是该员工的员工?对我来说,这听起来像是一个糟糕的设计,SQL SERVER排序是任意的,您需要使用嵌套集,这样在没有游标/循环的情况下就可以更容易地实现。不,我没有报告行,所以如果有人没有报告行,他们会向无报告行报告。这意味着,如果没有报告行是条目编号4,则经理将是4。错误是什么?你在proffiler中看到了什么?如果我像在上面一样运行它。我收到“命令成功完成”。但没有任何事情发生,我没有收到电子邮件。所以这就是为什么我不知道什么是错的。“似乎不起作用”是什么意思?错误?这是怎么一回事?错误的结果?目前的结果是什么?你在期待什么?