使用SET命令IF / ELSE更新表

时间:2015-06-30 11:24:53

标签: sql-server if-statement case

我试图更新表格,并且我想根据股票价值来判断2个不同的SET情景。

执行一个senario的工作代码。

UPDATE dbo.ar

    SET webPublish = '0', 
        ArtProdKlass = '9999',
        VaruGruppKod = '9999',
        ItemStatusCode = '9' --Utgått ur sortimentet+
        FROM tmp_9999
        WHERE ar.ArtNr = tmp_9999.art AND ar.lagsadloartikel < '1'    

我想做的是,如果最后一个声明(ar.lagsaldoartikel)是&gt;&#39; 1&#39;
那么我希望它能运行这个SET:

  SET   webPublish = '1', 
        ArtProdKlass = '1',
        VaruGruppKod = '9999',
        ItemStatusCode = '8' 

所以我测试了这样的事情:

    IF  AR.lagsaldoartikel < '1'

    SET webPublish = '0', 
        ArtProdKlass = '9999',
        VaruGruppKod = '9999',
        ItemStatusCode = '9' --Utgått ur sortimentet+

    FROM tmp_9999
    WHERE ar.ArtNr = tmp_9999.art --Väljer ut artiklar som enbart finns i textfilen och har lagersaldo mindre än 1
ELSE

    SET webPublish = '1', 
        ArtProdKlass = '1',
        VaruGruppKod = '9999',
        ItemStatusCode = '8' --Utgått ur sortimentet

    FROM tmp_9999
    WHERE ar.ArtNr = tmp_9999.art --Väljer ut artiklar som enbart finns i textfilen och har lagersaldo mindre än 1

2 个答案:

答案 0 :(得分:1)

使用CASE

UPDATE dbo.ar
    SET webPublish = '0', 
        ArtProdKlass = '9999',
        VaruGruppKod = '9999',
        ItemStatusCode = CASE WHEN AR.lagsaldoartikel < '1' THEN '9' ELSE '8' END
        FROM tmp_9999
        WHERE ar.ArtNr = tmp_9999.art

(如果ItemStatusCode等为数字,则应将其视为数字。)

答案 1 :(得分:1)

If是程序性T-SQL的一部分。您不能在关系中使用过程语句 - 使用if的唯一方法是使用两个单独的update语句,每个语句都在if的一个分支中。但是,这是一个坏主意 - 它不是并发安全的。

实现你要做的事情的一种方法是使用case语句 - 这只是一个表达式,所以它可以在set子句中使用就好了:

set webPublish = case when AR.lagsaldoartikel < '1' then '0' else '1' end

(等其他参数)。

但是,我想警告你 - 这几乎肯定是一个坏主意。当你意识到你可能想要的十种不同的条件和一百种不同的可能值时,它很可能会在未来很快回击你。考虑使用一种更具惯用性的关系方式来做这件事 - 例如,从不同的表中获取条件和参数 - 现在不需要,但是如果你发现你的条件正在扩展到合理的大小,请记住考虑改变整个结构如果需要,命令。