2017-12-31 101 views
0

SQL Serverが新しく、CASE内のWHEREステートメントの実装に問題があります。具体的には、作業しているトリガです。SQL Server - ケース内にはどこですか?

Iは、以下のフィールドを持つ2つのテーブルを有する:

Receipt(ItemID,Quantity) 

Warehouses(WarehouseID,Stock) 

|WarehouseID|Stock| 
------------------- 
|ARM01  |100 | 
|ARM02  |100 | 

任意の所与のアイテムの特定数量を含む行は、挿入改変または受信に削除されたかどうかをトリガーチェックを倉庫テーブルの在庫を減算または追加します。

領収書に200個の数量を含む行を追加すると、WarehouseID 'ARM01'の在庫から100を引いて、 'ARM01'に在庫がない場合(これは存在しないため100)、 'ARM02'から他の100を引きます。もちろん 'ARM02'に0の在庫がある場合、それはエラーを出力しますが、後でそれについて心配します。

事実、SQL ServerはCASE内でWHEREを受け入れません。もちろん、CASE全体が既にSETステートメントの一部であり、WHEREはSETの後にのみ来るからです。それは不思議ですが、私はそのような単純なことのためにまだオンラインで答えを見つけることができませんでした。

私の目標:

CASE 1 
UPDATE 'Stock of Table' where 'WarehouseID of Same Table' = 'ARM01' 
CASE 2 
UPDATE 'Stock of Table' where 'WarehouseID of Same Table' = 'ARM02' 

私はまた、証券取引のための計算を実現 -/+数量およびその逆は今間違っているかもしれないと私はまた、THENの後の括弧内に2文を持っている、で区切られました最初の100をARM01に、残りをARM02に配布しようとしていたためです。おそらく、間違ったコードについては、間違っていると思いますが、今のところWHEREステートメントをどこで使用するかを知りたいだけです。

CREATE TRIGGER SubtractStock ON Receipt 
FOR INSERT, UPDATE, DELETE 
AS 
[snipped UPDATE for deleted because it only exchanges '+' for '-' in the operation] 
UPDATE Warehouses 
SET Stock = 
    (CASE 
     WHEN inserted.Quantity <= Stock THEN Stock - Quantity WHERE WarehouseID = 'ARM01' 
     WHEN inserted.Quantity > Stock THEN (Stock - Quantity WHERE WarehouseID = 'ARM01') 
     AND (Quantity - Stock WHERE WarehouseID = 'ARM02') 
     END) 
    FROM inserted JOIN Warehouses ON inserted.ItemID = Warehouses.ItemID 

ありがとうございました!

答えて

1

トリガは嫌いですが、これは悪い考えです。それで途中で。 ARM01のために

、ANDとWHENにWHEREを移動:

SET Stock = 
    (CASE 
     WHEN inserted.Quantity <= Stock AND WarehouseID = 'ARM01' 
      THEN Stock - Quantity 
... 

次の問題は、株価がどうかを確認するためにARM02にあるもの、あなたはARM02のための在庫を設定するには2つの行を参照する必要があるがあなたはARM02から減算する必要があり、ARM02の在庫は減算する必要があります。だからどこか他の場所で条件を動かすことは助けにならないでしょう。おそらく2つの更新ステートメント、ARM01を更新して、出力節をtempテーブルまたはテーブル値変数に置き換えてから、ARM01の在庫値を前に与え、それを使用してARM02の値を更新します。

また、この種の複雑なロジックはまれに、がトリガーの中で適切です。

+0

を適切なエイリアスを使用してください。私はトリガーを作成する方法を学んだ後、個人的なプロジェクトのための練習としてこれをやっていたので、複雑なアプローチが最良の考えではないかもしれません。私が次にやるべきことについてのあなたの説明は、私が期待していたものと少し相違しています。ありがとう! – NinjaBaseballBatMan

0

...このようにしてみてください..私は見

CREATE TRIGGER SubtractStock ON Receipt 
FOR INSERT, UPDATE, DELETE 
AS 
UPDATE W 
SET Stock = CASE 
      WHEN WarehouseID = 'ARM01' AND I.Quantity <= Stock THEN Stock - Quantity 
      WHEN WarehouseID = 'ARM01' AND I.Quantity > Stock THEN Stock - Quantity 
      WHEN WarehouseID = 'ARM02' THEN I.Quantity - Stock 
     END 
FROM inserted I JOIN Warehouses W ON I.ItemID = W.ItemID 
関連する問題