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
,Status
并Priority
针对三种不同的列表(其实我对验证数据的值表,但为了简单起见,我硬编码在这里这些值),并更新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)
任何想法/方向都表示赞赏.谢谢.
这样的东西应该运行良好(并且只需要您输入一次值):
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小提琴.
祝好运.