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

Sql 即使条件为false,存储过程也会发送电子邮件。有什么想法吗?,sql,sql-server,Sql,Sql Server,当用户使用我们的网站处理某些请求时,在退出网站后,会向该用户发送一封带有链接的电子邮件,要求他/她单击链接进行调查,并与我们分享他/她的用户体验 下面是我编写的执行上述操作的存储过程 ALTER proc [dbo].[SendSurvey] AS BEGIN Declare @sender nvarchar(200) declare @dept nvarchar(200) = '' declare @loc nvarchar(200) = '' declare

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

下面是我编写的执行上述操作的存储过程

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的所有记录。它一次只发送一封电子邮件

  • 我们希望对orderstatus=1(True)的所有记录发送电子邮件


    你知道我做错了什么吗?

    你把WHERE从句混在一起了。结果将包括
    Email!=''中的所有行,不考虑其他条件

    使用parens来实现这一点:

    WHERE email=@email
    AND (Email IS NOT NULL or Email != '')
    AND (orderStatus != 1)
    
    至于为什么它一次只发送一封电子邮件,您可以使用您的查询来填充标量变量

    SELECT @email = email...
    
    无论查询返回多少行,都将导致用一个值填充
    @email

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

    是的-这就是
    sp\u send\u 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
    

    当然,无论状态如何,它都会发送一封电子邮件,您对该代码没有任何条件。@Tab_Alleman,谢谢您的回复。最初,我使用这种方法发送所有电子邮件:
    SELECT@email=@email++电子邮件…
    。然而,每个收件人都会看到其他收件人的电子邮件。正如你所知,我尝试了你的方法,但电子邮件仍然会发出。这次唯一的区别是“收件人”字段和“亲爱的”字段中都没有名字……这是因为您的表中有一行具有“电子邮件”值,但没有“submittedBy”值。如果你不想发生这种情况,你应该在你的WHERE子句中为submittedBy列设置一个类似的条件。非常感谢你的回复。我实际上是在使用游标,但当我尝试测试它时,我得到了一些奇怪的错误,但我现在记不起错误了。如果我遇到问题,我会试试你的,然后回来。此外,使用游标是否会阻止用户查看其他用户的电子邮件地址?