Select Case确定退出代码或运行Update语句

时间:2015-07-27 20:53:47

标签: sql-server tsql sql-update case

尝试获取select case语句,以根据两个不同表中的三个字段的总和来控制是否发生任何事情或更新表。其中一个表是临时表(#tempGLsum)。这保存了id字段和总和。 " amt" tblPcardGL表中的字段不应低于0(零)。如果可以,那么流程应该停止。如果它仍然是> 0,然后运行下一个代码块,它会更新tblPcardGL表。

任何援助都会得到满足! 感谢

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

1 个答案:

答案 0 :(得分:0)

您无法通过案例陈述真正做到您想要的事情。你只需要分两步完成:

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

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,这将使其所在的任何表达式变为空。< / p>