2015-09-30 29 views
1

我有一个场景,我必须根据Start_Month更新Customer表的Billing_Start_Month列。TSQL:使用case语句的奇怪行为

我已经在excel表格中给出了Start_Month值以及客户名称。为此,我创建了一个临时表并插入了所有CustomerName和Start_Month值。在Excel工作表中,Start_Month值还包含一些其他值,例如:(如果Start_Month是月份,如1月,2月等,则将Billing_Start_Month列更新为1,2,但如果Start_Month值包含1,3,4,5,7等值我们需要保留这些记录而不更新客户表的Billing_Start_Month列)。我们在Excel表格中只有5条记录,其中有Start_Month值,比如“1,3,4,5,7”。

现在,我使用下面的查询更新客户表中的列Billing_Start_Month:

UPDATE Customer 
SET Billing_Start_Month = CASE WHEN tmp.StartMonth = 'January' THEN 1 
           WHEN tmp.StartMonth = ‘February’ THEN 2 
          END 
FROM #temp tmp 
INNER JOIN Customer c 
ON tmp.Customer = c.acc_name  

但在执行这个查询我正在检查约束失败的错误。当我从临时表中删除包含“1,3,4,5,7”的Start_Month值的记录时,上述查询成功执行。

Simillarly,如果我不删除含有“1,3,4,5,7”,从临时表START_MONTH值的记录,然后我必须包括另一个时的情况下,这样的部分,

CASE WHEN tmp.StartMonth = 'January' THEN 1 
    WHEN tmp.StartMonth = ‘February’ THEN 2 
    WHEN tmp.StartMonth = ‘1,3,4,5,7’ THEN 1235 –- any random value and not null 
END 

请帮我理解case语句的这种行为。我假设,当我在案例陈述中不包括案例'1,3,4,5,7'时,这5条记录在更新声明中不予考虑。

+0

另外,你的一些引号似乎不是正确的('''!='''')。 –

+0

此外,如果月份与两个选项中的任何一个都不匹配,您可能还需要包含“ELSE”条件。 –

+0

Case语句迫使我在{tmp.StartMonth ='1,3,4,5,7'}时包含条件,否则检查约束被解雇 – PS078

回答

4

您的UPDATE语句尝试更新所有记录。根据你的描述,这听起来像是有一些场景,你的CASE条件都不会产生任何东西,而你没有别的。您可以执行ELSE Billing_Start_Month来简单地产生与案例不匹配的记录的当前值。

或者,您可以将WHERE添加到更新中,以便仅更新Start_MonthJanuaryFebruary的行。

4

您可以尝试使用以下查询。如果月份不是1月份或2月份(换句话说,它不会在此情况下更改记录),我已将ELSE条件添加到CASE声明中,该声明仅使用Billing_Start_Month声明。

UPDATE Customer 
SET Billing_Start_Month = CASE WHEN tmp.StartMonth = 'January' THEN 1 
           WHEN tmp.StartMonth = 'February' THEN 2 
           ELSE Billing_Start_Month 
          END 
FROM #temp tmp 
INNER JOIN Customer c 
ON tmp.Customer = c.acc_name