3

ストアドプロシージャにテーブルタイプパラメータとして受け取るテーブルがあります(Excelブックのソースから取得されますが、それは別の話です)。各列の有効な値のリストに対して値を検証する必要があるいくつかの列があります。

私のテーブルが次のOriginDetailsようになっているとしましょう(これは単なるモックデータであることに注意してください。検証する8列ごとに2つのテーブルがあります)-

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

そして、私は列の値を検証し、Origin3つの異なるリストに対して検証しています(実際にはテーブルのデータに対して値を検証していますが、簡単にするためにここでこれらの値をハードコーディングしました)、検証に基づいて列を更新します-StatusPriorityErrMsg

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')

これはすべてうまく機能し、うまく機能します-しかし、2つのテーブルに対して16のそのような更新ステートメントが一緒になってしまうので、非常に大きくて醜いコードのブロックがあります(そして、2つのコードがほぼ同じであるため、多くの重複がありますテーブル)。

テーブルごとに1つのステートメントですべての更新を実際に実行できる方法はありますか?

以下のようなものですが、1つだけではなく各条件を実行する必要があります-

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

そして、これがSQLFiddleです。

幸運を。

于 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 に答える