3

我在存储过程中收到了一个表作为表类型参数(它来自 excel 工作簿源,但这是另一回事)。它有几列,我需要根据每列的有效值列表来验证这些值。

假设我的表OriginDetails看起来像这样(请注意,这只是模拟数据;我有两个这样的表,每 8 列我将验证) -

Origin   | Status     | Priority | ErrMsg
------------------------------------------
Testing  | In Review  | Low      | 
Design   | Initiated  | Medium   | 
Prod     | Declined   | Critical |           

而且,我正在验证列中的值OriginStatusPriority针对三个不同的列表(实际上我正在验证表中的数据的值,但为简单起见,我在这里硬编码了这些值),并ErrMsg根据我的验证更新列 -

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Invalid Origin' 
WHERE Origin NOT IN ('Pre-Design','Design','Development') 

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Unrecognized Status' 
WHERE Status NOT IN ('In Review','Approved') 

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Priority check failed' 
WHERE Priority NOT IN ('Critical','Medium','High')

这一切都很好,很好,效果很好 - 但我最终得到了 16 个这样的更新语句,用于 2 个表,所以我有一个非常大而丑陋的代码块(还有很多重复,因为我有 2 个几乎相同的代码表)。

有没有一种方法可以让每个表的所有更新都在一个语句中完成?

类似于下面的内容,除了它应该执行每个条件而不是只执行一个-

UPDATE OriginDetails
SET ErrMsg = ErrMsg + 
(CASE WHEN Origin NOT IN ('Pre-Design','Design','Development') 
           THEN '|Invalid Origin'
      WHEN Status NOT IN ('In Review','Approved') 
           THEN '|Unrecognized Status'
      WHEN Priority NOT IN ('Critical','Medium','High') 
           THEN '|Priority check failed'
END)

任何想法/方向表示赞赏。谢谢。

4

2 回答 2

6

像这样的东西应该可以很好地工作(并且只需要您一次键入值):

UPDATE OriginDetails
SET ErrMsg = ErrMsg + 
    CASE WHEN Origin NOT IN ('Pre-Design','Design','Development') THEN '|Invalid Origin' ELSE '' END
    + CASE WHEN Status NOT IN ('In Review','Approved') THEN '|Unrecognized Status'  ELSE '' END
    + CASE WHEN Priority NOT IN ('Critical','Medium','High')  THEN '|Priority check'  ELSE '' END

这是SQL Fiddle

祝你好运。

于 2013-01-27T06:41:55.520 回答
1

这个怎么样:

UPDATE OriginDetails
SET ErrMsg = ErrMsg + 
(CASE 
WHEN Origin NOT IN ('Pre-Design','Design','Development') and Status NOT IN ('In Review','Approved') and Priority NOT IN ('Critical','Medium','High') 
           THEN '|Invalid Origin|Unrecognized Status|Priority check failed'
WHEN 
Origin NOT IN ('Pre-Design','Design','Development') and Status NOT IN ('In Review','Approved') and Priority IN ('Critical','Medium','High') 
           THEN '|Invalid Origin|Unrecognized Status'


END)

您可以像我一样添加所有案例。

于 2013-01-27T06:22:22.463 回答