2017-12-31 98 views
0

저는 SQL Server를 처음 접했고 CASE 내에서 WHERE 문을 구현하는 데 어려움을 겪고 있습니다.SQL Server - 케이스 내부 어디에 있습니까?

Receipt(ItemID,Quantity) 

Warehouses(WarehouseID,Stock) 

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

주어진 항목의 특정 수량 행을 삽입 변경 또는 수신에 제거되었는지 트리거 확인 :

난 다음 필드 2 개 테이블이 그런 다음 창고 테이블의 재고를 뺍니다.

영수증에 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' 

-/+ 수량 반대로 지금은 잘못 될 수 있으며 나 또한 그런 다음에 의해 분리 된 후 괄호 안의 2 문이 그리고 첫 번째 100을 ARM01에 배포하고 나머지는 ARM02에 배포하려고했기 때문에 AND. 이것은 잘못된 코드에 대한 잘못된 정보 일 뿐이지 만, 지금은 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로하는 경우에 WHERE 이동 :

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

주식은 ARM02에 당신이 ARM02에 대한 재고를 설정하기 위해 두 행을 볼 필요가있다 다음 문제가 있는지 확인하기 위해 ARM02에서 빼고 ARM02에서 빼기를 수행해야합니다. 따라서 다른 곳의 조건을 움직이면 도움이되지 않습니다. 아마도 두 개의 업데이트 구문 인 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