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中看到了什么?如果我像在上面一样运行它。我收到“命令成功完成”。但没有任何事情发生,我没有收到电子邮件。所以这就是为什么我不知道什么是错的。“似乎不起作用”是什么意思?错误?这是怎么一回事?错误的结果?目前的结果是什么?你在期待什么?