即使条件为假,存储过程也会发送电子邮件。有什么想法吗?

时间:2015-08-28 15:34:31

标签: sql sql-server

当用户使用我们的网站处理某些请求时,在退出网站时,会向该用户发送一封带有链接的电子邮件,要求他/她点击该链接进行调查并与我们分享他/她的用户体验

以下是我编写的存储过程,如上所述。

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

存储过程存在两个问题。

  1. orderStatusBIT数据类型,其中True(1)为false(0)值。

    如果orderstatus为false,则发送包含与之关联的记录的电子邮件。

    发送电子邮件后,将orderstatus更新为true,这样电子邮件就不会再次发送。

    这不起作用。当我执行存储过程,其中表上的所有记录都将orderstatus设置为True时,电子邮件仍然会消失。

  2. 我遇到的第二个问题是代码没有发送orderStatus为True的所有记录。它只是一次发送一封电子邮件。

  3. 我们希望发送电子邮件以发送ordertatus = 1(True)的所有记录。

    任何想法我做错了什么?

2 个答案:

答案 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