我可以多次迭代更新单个列 - 在一个语句中吗?

Cha*_*ait 3 sql t-sql sql-server sql-server-2008

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

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

Origin   | Status     | Priority | ErrMsg
------------------------------------------
Testing  | In Review  | Low      | 
Design   | Initiated  | Medium   | 
Prod     | Declined   | Critical |           
Run Code Online (Sandbox Code Playgroud)

而且,我在列验证值Origin,StatusPriority针对三种不同的列表(其实我对验证数据的值表,但为了简单起见,我硬编码在这里这些值),并更新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')
Run Code Online (Sandbox Code Playgroud)

这一切都很好,花花公子,效果很好 - 但我最终得到了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)
Run Code Online (Sandbox Code Playgroud)

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

sge*_*des 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
Run Code Online (Sandbox Code Playgroud)

这是SQL小提琴.

祝好运.