【问题标题】:An expression of non-boolean type specified in a context where a condition is expected near 'END'在“END”附近预期条件的上下文中指定的非布尔类型的表达式
【发布时间】:2016-11-16 01:16:47
【问题描述】:

所以我正在运行这个查询并继续收到上述错误 消息 4145,级别 15,状态 1,过程 GetQN8,第 1592 行 在预期条件的上下文中指定的非布尔类型表达式,在“END”附近。。有人可以帮我看看我哪里出错了吗?

这是代码 -

       USE [MailActivity]
       GO

       IF OBJECT_ID('GetQN8') IS NULL
       EXEC('CREATE PROCEDURE GetQN8 AS SET NOCOUNT ON;')
       GO

       ALTER PROCEDURE GetQN8 (@CampaignName VARCHAR(200),@EngagedMonths INT, @Active VARCHAR(10), @NotInGroup INT, @CampaignNameForDupCheck VARCHAR(200))
       AS
       BEGIN
       SET NOCOUNT ON

   -- CREATE TEMP TABLES  DROP TABLE #tempParticipantDataQN8
   CREATE TABLE #tempParticipantDataQN8
   (
          ParticipantId INT PRIMARY KEY,
          GroupId INT,
          EmailAddress VARCHAR(200),
          FirstName VARCHAR(100),
          ActiveYN CHAR(1),
          NewsLetterStatus CHAR(1),
          ExpirationDate DATETIME
   )

   -- CREATE INDEX
   CREATE NONCLUSTERED INDEX [IX_TempParticipantDataEmail] ON #tempParticipantDataQN8
   (
          [EmailAddress] ASC
   )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

   -- DROP TABLE #tempParticipantAuditDataQN8
   CREATE TABLE #tempParticipantAuditDataQN8
   (
          ParticipantId INT,
          ColumnName VARCHAR(100),
          AfterChangeValue VARCHAR(100),
          LastChangedDate DATETIME,
          LastChangedUser VARCHAR(100)
   )

   -- CREATE INDEX
   CREATE NONCLUSTERED INDEX [IX_TempParticipantAuditDataColumnName] ON #tempParticipantAuditDataQN8
   (
          [ColumnName] ASC
   )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

   CREATE NONCLUSTERED INDEX [IX_TempParticipantAuditDataPartId] ON #tempParticipantAuditDataQN8
   (
          [ParticipantId] ASC
   )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

   INSERT INTO #tempParticipantDataQN8 (ParticipantId,EmailAddress,FirstName,ActiveYN,NewsLetterStatus,GroupId,ExpirationDate)
   SELECT p.ParticipantId,
             p.[Preferred Email],
             p.[First Name],
             p.ActiveYN,
             p.NewsLetterStatus,
             p.GroupId,
             p.expirationdate
   FROM ids_reporting.ids_reporting.dbo.Participant p WITH (NOLOCK)
   JOIN ids_reporting.ids_reporting.dbo.[Group] gr WITH (NOLOCK)
   ON p.groupId = gr.groupId
   WHERE 1=1
   AND ((p.[Preferred Email] NOT LIKE '%@none.com') AND (p.[Preferred Email] IS NOT NULL))  -- Has an email address
   AND ISNULL(gr.parentGroupId,'') <> 1269

   -- PULL AUDIT
   INSERT INTO #tempParticipantAuditDataQN8 (       ParticipantId, ColumnName, AfterChangeValue, LastChangedDate, LastChangedUser)
   SELECT a.ParticipantId, ColumnName, AfterChangeValue, LastChangedDate, LastChangedUser
   FROM ids_reporting.ids_reporting.dbo.Participant_Audit a
   JOIN #tempParticipantDataQN8 p
   ON p.ParticipantId = a.ParticipantId
   AND a.ColumnName = 'NewsLetterStatus'
   AND a.AfterChangeValue = 'U'

   --Query 
   SELECT DISTINCT(p.[EmailAddress]) AS [EmailAddress],
             p.FirstName AS [FirstName],
             p.GroupId AS [GroupId]
   FROM [CampaignLists],#tempParticipantDataQN8 p

   LEFT OUTER JOIN MailActivity.dbo.SupressionList08012016 sup
   ON p.[EmailAddress] = sup.EmailAddress

   JOIN MailActivity.dbo.MailActivities maEng WITH (NOLOCK)
    ON (p.[EmailAddress] = maEng.EmailAddress
        AND maEng.EventType = 'MessageGears.Model.Generated.OpenActivity'
        AND maEng.EventTimestamp >= DATEADD(month, @EngagedMonths, GETDATE()) 
        )

   LEFT OUTER JOIN
   (
          SELECT DISTINCT(EmailAddress) AS [EmailAddress]
          FROM MailActivity.dbo.MailActivities WITH (NOLOCK)
          WHERE EventType = 'MessageGears.Model.Generated.BouncedActivity'
          AND CategoryCode NOT IN ('10', '30')
          GROUP BY EmailAddress
          HAVING COUNT(*) >= 3
   ) AS SoftBounce
   ON p.[EmailAddress] = SoftBounce.EmailAddress
   LEFT OUTER JOIN MailActivity.dbo.MailActivities spam WITH (NOLOCK)
          ON (p.[EmailAddress] = spam.EmailAddress
                 AND spam.EventType IN ('MessageGears.Model.Generated.UnsubActivity', 'MessageGears.Model.Generated.SpamComplaintActivity') )
   WHERE 1=1
   AND SoftBounce.EmailAddress IS NULL -- No soft bounces >= 3
   AND spam.EmailAddress IS NULL -- No spam complaints
   AND sup.EmailAddress IS NULL -- No suppression list
   AND p.ActiveYN = @Active
   AND [CampaignLists].CampaignName = @CampaignName


   AND ((p.[EmailAddress] NOT LIKE '%@none.com') AND (p.[EmailAddress] IS NOT NULL))  -- Has an email address
   AND p.GroupId NOT IN (@NotInGroup)

   AND NOT EXISTS (SELECT 1 FROM MailActivity.dbo.MailActivities
                        WHERE EmailAddress = p.[EmailAddress]
                        AND RequestId IN
                               (SELECT DISTINCT(RequestId) FROM [CampaignLists]
                                WHERE CampaignName = @CampaignNameForDupCheck
                                )
        )
   END

更新:所以我将 [CampaignLists].CampaignName 移回 WHERE 子句,因为我需要获取 @CampaignName 中的记录,同时忽略另一个活动/表中的重复记录最后由@CampaignNameForDupCheck 检查。执行更新后的查询现在给我 0 条记录。

【问题讨论】:

  • 愚蠢的问题:END 后面缺少的分号会是这里的罪魁祸首吗?
  • END 后面的分号不起作用。

标签: sql sql-server tsql


【解决方案1】:

我相信您在过程中最后一个查询的最后条件中缺少EXISTS/NOT EXISTS

AND EXISTS (SELECT * FROM MailActivity.dbo.MailActivities
                    WHERE EmailAddress = p.[EmailAddress]
                    AND RequestId IN
                           (SELECT DISTINCT(RequestId) FROM [CampaignLists]
                            WHERE 1=1
                            AND CampaignName = @CampaignName
                            AND RequestId <> @CampaignNameForDupCheck
                            )
    )

查看子查询中的* 和此相关条件EmailAddress = p.[EmailAddress] 我假设您需要EXISTS。如果没有,请在评论中回复

【讨论】:

  • 好收获!所以我更新了代码以使用 NOT EXISTS,因为我只想要 CampaignName 中的记录,而忽略 CampaignNameForDupCheck 中的重复记录。你能告诉我是什么导致查询在更新后给出 0 条记录吗?在 FROM 子句中也包含了表名,但我认为这就是问题所在
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 2021-02-26
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多