【问题标题】:Stored Procedure Case statement override each other存储过程 Case 语句相互覆盖
【发布时间】:2016-11-19 05:03:06
【问题描述】:

这是我之前帖子的修改版。请帮我解决一下这个。 如果子查询我得到正确的结果。但是当我运行完整的 sp 警报案例和字段案例时,它们会相互覆盖。

Getting null value in status field, can anyone explain what I am going wrong?

(CASE       
    WHEN EXISTS(SELECT [GunSerialNo] FROM [dbo].[ArmouryIssueGun] 
                WHERE aig.ModifiedOn IS NOT NULL 
                  AND aig.CreatedOn IS NOT NULL)
        THEN 'In Armory'

    WHEN EXISTS(SELECT aig.GunSerialNo 
                FROM [dbo].[ArmouryIssueGun] AS aig 
                INNER JOIN (SELECT * 
                            FROM 
                                (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
                                 FROM [ArmouryIssueGun]) ag 
                            WHERE ag.TIME_ADDED<GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo
                WHERE aig.ModifiedOn IS NULL
                  AND aig.CreatedBy IS NOT NULL)
        THEN 'Alert' 

    WHEN EXISTS (SELECT aig.GunSerialNo 
                 FROM [dbo].[ArmouryIssueGun] AS aig 
                 INNER JOIN (SELECT * 
                             FROM 
                                 (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
                                  FROM [ArmouryIssueGun]) ag 
                             WHERE ag.TIME_ADDED>GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo
                 WHERE aig.ModifiedOn IS NULL
                   AND aig.CreatedBy IS NOT NULL)
        THEN 'In Field'
 END) AS [Status],
FROM 
    [dbo].[CarryAndUseLicence] cl 
INNER JOIN
    [dbo].[Branch] b ON b.[BranchId] = cl.[BranchId]
INNER JOIN
    [dbo].[Gun] gun ON cl.[GunSerialNo] = gun.[SerialNo]
INNER JOIN
    [dbo].[ArmouryIssueGun] aig ON aig.[StaffId] = cl.[StaffId]     

【问题讨论】:

  • 尝试用有效结果替换所有子查询并运行程序,检查是否正常

标签: sql sql-server stored-procedures


【解决方案1】:

问题在于别名 aig 的双重使用。 Exists-query 中的别名会覆盖顶部查询中的别名。因此,Exists-query 不包括当前记录,而是查看整个表。

它是如何工作的:

WHEN EXISTS(SELECT aig2.GunSerialNo 
            FROM [dbo].[ArmouryIssueGun] AS aig2 
            INNER JOIN (SELECT * 
                        FROM 
                            (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
                             FROM [ArmouryIssueGun]) ag 
                        WHERE ag.TIME_ADDED<GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo
            WHERE aig2.ModifiedOn IS NULL
              AND aig2.CreatedBy IS NOT NULL)
    THEN 'Alert' 

WHEN EXISTS (SELECT aig2.GunSerialNo 
             FROM [dbo].[ArmouryIssueGun] AS aig2 
             INNER JOIN (SELECT * 
                         FROM 
                             (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
                              FROM [ArmouryIssueGun]) ag 
                         WHERE ag.TIME_ADDED>GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo
             WHERE aig2.ModifiedOn IS NULL
               AND aig2.CreatedBy IS NOT NULL)
    THEN 'In Field'

或更短

WHEN EXISTS(SELECT *
              FROM [ArmouryIssueGun]
             WHERE GunSerialNo = aig.GunSerialNo
               AND DATEADD(HOUR, EstimatedTime, CreatedOn) < GETUTCDATE() 
               AND ModifiedOn IS NULL
               AND CreatedBy  IS NOT NULL
              )
    THEN 'Alert' 

WHEN EXISTS(SELECT *
              FROM [ArmouryIssueGun]
             WHERE GunSerialNo = aig.GunSerialNo
               AND DATEADD(HOUR, EstimatedTime, CreatedOn) > GETUTCDATE() 
               AND ModifiedOn IS NULL
               AND CreatedBy  IS NOT NULL
              )
    THEN 'In Field' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2014-12-01
    • 2018-06-02
    • 1970-01-01
    • 2017-01-31
    • 2011-04-29
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多