当用户使用我们的网站处理某些请求时,在退出网站时,会向该用户发送一封带有链接的电子邮件,要求他/她点击该链接进行调查并与我们分享他/她的用户体验
以下是我编写的存储过程,如上所述。
ALTER proc [dbo].[SendSurvey]
AS
BEGIN
Declare @sender nvarchar(200)
declare @dept nvarchar(200) = ''
declare @loc nvarchar(200) = ''
declare @dteCreated nvarchar
declare @RequestID nvarchar(50) = ''
declare @authorizedname nvarchar(200) = ''
declare @email nvarchar(200) = ''
declare @message nvarchar(1000) = ''
declare @mailid int = 0
SET QUOTED_IDENTIFIER OFF;
SELECT
@email = email, @mailid=ID, @message = @message,
@RequestID = RequestID,
@authorizedname = SUBSTRING(submittedBy, CHARINDEX(',', submittedBy) + 1, LEN(submittedBy) - CHARINDEX(',', submittedBy) + 1)
+ ' ' + SUBSTRING(submittedBy, 1, CHARINDEX(',', submittedBy) - 1),
@loc = Bldg, @dtecreated = DateCreated, @dept = Department
FROM
Survey
WHERE
email = @email
AND Email IS NOT NULL OR Email != ''
AND (orderStatus != 1)
SELECT @message = 'This is a computer generated email message.
Please DO NOT use the REPLY button above to respond to this email.
Dear '+ @authorizedname +':
Thank you for using the order processing system.
Please click the link below to complete a survey
http://feedbacksurvey.php?rID=' +@RequestID+'&loc='+Replace(@loc,' ', '%20')+'&dept='+Replace(@dept,' ', '%20')+'
Regards,
web admin.'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Customer Feedback Survey',
@recipients = @Email, -- your email
@subject = 'Customer Feedback Survey',
@body = @message;
UPDATE Survey
SET orderStatus = 1
WHERE orderStatus != 1 AND ID = @mailid
END
存储过程存在两个问题。
列orderStatus
是BIT
数据类型,其中True(1)为false(0)值。
如果orderstatus
为false,则发送包含与之关联的记录的电子邮件。
发送电子邮件后,将orderstatus
更新为true,这样电子邮件就不会再次发送。
这不起作用。当我执行存储过程,其中表上的所有记录都将orderstatus设置为True时,电子邮件仍然会消失。
我遇到的第二个问题是代码没有发送orderStatus
为True的所有记录。它只是一次发送一封电子邮件。
我们希望发送电子邮件以发送ordertatus = 1(True)的所有记录。
任何想法我做错了什么?
答案 0 :(得分:2)
您在WHERE子句中混合AND和OR。无论其他条件如何,结果都将包含Email != ''
的所有行。
使用parens来完成这项工作:
WHERE email=@email
AND (Email IS NOT NULL or Email != '')
AND (orderStatus != 1)
至于为什么它一次发送一封电子邮件,您正在使用查询来填充标量变量。
SELECT @email = email...
无论查询返回多少行,都会导致@email
填充一个值。
答案 1 :(得分:0)
我遇到的第二个问题是代码没有发送orderStatus为True的所有记录。它只是一次发送一封电子邮件。
是的 - 这就是sp_send_dbmail
的工作方式。你需要一个光标来发送> 1封电子邮件。
DECLARE c CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT ....
FETCH NEXT FROM c INTO ....
WHILE @@FETCHSTATUS = 0 BEGIN
EXEC sp_send_dbmail ...
FETCH NEXT FROM c INTO ....
END
CLOSE c
DELLOCATE c