Select 案例确定退出代码或 运行 更新语句

Select Case determines Exit code or run Update statement

正在尝试获取 select case 语句以控制是否没有任何反应或根据来自两个不同 table 的三个字段的总和更新 table。 table 之一是临时 table (#tempGLsum)。这包含 id 字段和总金额。 tblPcardGL table 中的 "amt" 字段永远不应低于 0(零)。如果是这样,那么流程应该停止。如果它仍然 > 0,那么下一个代码块将 运行,更新 tblPcardGL table.

如有任何帮助,我们将不胜感激! 谢谢

declare @glID int

create table #tempGLsum
    (glID  int, sumAmt decimal(18,2))

insert into #tempGLsum
    (glID, sumAmt)

        select      tblPcardReclass.glID,
                    sum(tblPcardReclass.reclassAmt)

        from tblPcardReclass

        where tblPcardReclass.glID = @glID

        group by tblPcardReclass.glID


select 
        case when (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) < 0
            then 'stop here and let the user know it's below zero'
            else
            'run the code_below'
        end                         

from tblPcardGL

left outer join #tempGLsum ON
                tblPcardGL.glID = #tempGLsum.glID

where   tblPcardGL.glID = @glID         

-- code_below

    update tblPcardGL
    set amt =
    (
    select 
            case (select COUNT(*) as numRecs from #tempGLsum)
                when 0 then
                    tblPcardGL.orgAmt 

                else
                    (tblPcardGL.orgAmt - #tempGLsum.sumAmt) 
            end
    )
    from tblPcardGL

    left outer join #tempGLsum ON
                    tblPcardGL.glID = #tempGLsum.glID

    where tblPcardGL.glID = @glID

你不能用 case 语句真正做你想做的事。您只需分两步完成:

首先运行select用where子句向用户展示所有问题:

select tblPcardGL.*, 'Below Zero!' Error                
from tblPcardGL
left outer join #tempGLsum ON
                tblPcardGL.glID = #tempGLsum.glID
where   tblPcardGL.glID = @glID 
    and (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) < 0

然后使用另一个 where 子句进行更新:

update tblPcardGL
set amt =
(
select 
        case (select COUNT(*) as numRecs from #tempGLsum)
            when 0 then
                tblPcardGL.orgAmt 
            else
                (tblPcardGL.orgAmt - #tempGLsum.sumAmt) 
        end
)
from tblPcardGL
left outer join #tempGLsum ON
                tblPcardGL.glID = #tempGLsum.glID
where tblPcardGL.glID = @glID
    and (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) >= 0

您应该考虑将所有 #tempGLsum.sumAmt 字段包装在 isnull(#tempGLsum.sumAmt,0) 中,因为您使用了 left join 以便该列的计算结果可能为 null,这将使它所在的任何表达式变为 null .