存储过程中的SQL IF条件

时间:2015-08-28 16:01:00

标签: sql-server

我对高级数据库查询和存储过程比较陌生,我在下面的过程中遇到第三个UPDATE语句的问题,IF代码块中的一个。问题是我需要向这些帐户添加成员资格编号,因此UPDATE的第一次迭代会将lp.ID_1添加到我的临时表中,而第二次迭代会将lp.ID_2添加到临时表中。第三次迭代需要从原始INSERT语句中获取剩余的行(其中ident仍应为NULL)并将ident列与ID_1和{{1}连接起来因为这些帐户都有会员资格。

我在ID_2区块中尝试了几个条件,但每次似乎都没有达到解决方案。

IF

2 个答案:

答案 0 :(得分:2)

我认为整个更新和左连接shebang可以在一个查询中编写而无需任何更新或临时表

;WITH X AS 
 (
    select distinct st.ship2, t.name, null AS ident 
    from sales_table st
    INNER JOIN account_table t ON st.ship2 = t.acct
    where st.bill2 = @acct
 )
SELECT x.ship2 AS s_acct
      ,x.name
      ,COALESCE(ident, lp.ID_2 +', '+ lp.ID_1 , lp.ID_1 , lp.ID_2 , '' ) AS Ident 
FROM X 
LEFT JOIN lp_table lp ON x.ship2 = lp.acct COLLATE Latin1_General_CS_AS
WHERE COALESCE(ident, lp.ID_2 +', '+ lp.ID_1 , lp.ID_1 , lp.ID_2 , '' ) <> ''

答案 1 :(得分:0)

第二次更新查询无效。第一个更新查询是使用lp_table更新与“acct”匹配的#temp_table行的所有标识值。第二个查询正在查看您刚刚更新的完全相同的行集,其中添加的条件是您只对ident为null的那些行感兴趣....但是在第一步中您确保没有为null。我认为您要做的是确定哪些行未被第一个查询更新,假设某些标识更新为Null。我假设ID_1 \ ID_2中的一些数据为空,因为acct列将始终填充数据。如果我的假设是正确的,您可以执行以下操作:

将您的查询更改为:

create table #temp_table
(
    s_acct char(8) null,
    name varchar(50) null,
    ident varchar(10) null
)

insert into #temp_table
select distinct st.ship2, t.name, null
from sales_table st, account_table t
where st.bill2 = @acct
and st.ship2 = t.acct

update #temp_table
set ident = COALESCE(lp.ID_1, lp.ID_2, 'BOTH LPS ARE NULL?')
from lp_table lp
where #temp_table.s_acct = lp.acct COLLATE Latin1_General_CS_AS


select * from #temp_table
where ident is not null

根据M.Ali的回答,可以改进它以删除任何临时表使用并一次完成。为了完整起见,我把它包括在内。