sql-server - EXEC msdb.dbo.sp_send_dbmail 忽略查询
问题描述
我有一个向客户发送生日电子邮件的代码,查询工作正常,但 SQL 邮件服务器总是向所有客户发送生日电子邮件,即使他没有生日
use Insurance
go
select
Customer.CustomerID
,Customer.FirstName
,Customer.LastName
,Customer.Birthday
,Customer.Email
from Customer
where Customer.CustomerID = Customer.CustomerID and
DAY([Birthday]) = DAY(GETDATE())
AND MONTH([Birthday]) = MONTH(GETDATE())
declare @Receipientlist nvarchar(4000)
set @Receipientlist =
STUFF((select ';' + Email FROM dbo.Customer FOR XML PATH('')),1,1,'')
EXEC msdb.dbo.sp_send_dbmail @profile_name='test',
@recipients=@Receipientlist,
@subject='Insurance',
@body='Happy Birthday.
Today is your Birthday.'
解决方案
您在批处理顶部的查询与您执行的语句无关msdb.dbo.sp_send_dbmail
。如果您只想通过电子邮件发送客户的生日,您需要在创建收件人的语句中进行过滤(并且您不需要之前的语句):
DECLARE @RecipientList nvarchar(4000);
--I removed the CustomerID = CustomerID clause, as it'll always equal itself,
--apart from when it's value is NULL (and I doubt it'll ever be NULL)
SET @RecipientList = STUFF((SELECT N';' + Email
FROM dbo.Customer
WHERE DAY([Birthday]) = DAY(GETDATE())
AND MONTH([Birthday]) = MONTH(GETDATE())
FOR XML PATH(N''),TYPE).value('.','nvarchar(4000)'), 1, 1,N'');
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'test',
@recipients = @RecipientList,
@subject = 'Insurance',
@body = 'Happy Birthday.
Today is your Birthday.';
我还更改了返回、使用子查询的值TYPE
和value
子句的方式。TYPE
电子邮件地址可以包含一些特殊字符,如果不使用(例如&
将变为&
) ,这些字符将被转义。(我还更正了 的拼写@RecipientList
。)
推荐阅读
- python - 使用python解析DNS RDATA
- python - 熊猫插值保持原始索引
- css - 粘性 flexbox 页脚未固定到底部
- python - 使用左右边距和固定行长写入文件的 Python 代码
- rust - 如何在不知道其类型的情况下获取异构列表的各个元素?
- ssis - SQL Server 2016:使用 dtexec 从 cmd 行运行 DTS 包以从表导出到平面文件时出错
- jhipster - jHipster swagger api-doc 未发送 JWT 授权标头导致 401
- javascript - InsertBefore() 不能与 variable.insertBefore() 一起正常工作
- r - 在 Windows 下从 github 存储库构建和安装 r 包
- python - 如何在mysql中搜索多少重复并进行比较