希望為單個測驗表創建一個動態存盤程序,我可以根據傳遞給它的引數更改其中一列中的值。
示例:我有一張桌子,我希望能夠將電影 ( MovieID) 從一家商店 ( StoreID) “移動”到另一家商店,并展示庫存中的移動 ( Movies_in_stock)。一旦存盤程序運行(并取決于輸入的引數),它應該顯示例如 1 個帶有MovieID = 100in 的電影StoreID 1已被移動到StoreID 2-Movies_in_stock隨后減少StoreID = 1和增加(加上一個新行)StoreID = 2。
請參閱下表更改。
| StoreID | MovieID | Movies_in_stock |
| 1 | 100 | 10 |
| 2 | 200 | 20 |
| 3 | 300 | 50 |
| 1 | 400 | 100 |
| 2 | 500 | 5 |
運行存盤程序后,我希望得到以下資料:
| StoreID | MovieID | Movies_in_stock |
| 1 | 100 | 9 |
| 2 | 200 | 20 |
| 3 | 300 | 50 |
| 1 | 400 | 100 |
| 2 | 500 | 5 |
| 2 | 100 | 1 |
到目前為止我所做的:
- 設定引數:
MovieID = @MovieID, StoreID = @StoreID_From , StoreID = @StoreID_To, Movies_in_stock = @Stock (optional param)
- 試圖找出如何可能合并
CASE有UPDATE:
UPDATE Table1
SET Movies_in_stock =
(CASE WHEN @StoreID = x AND @StoreID = y
THEN (Movies_in_stock = Movies_in_stock /- @Movies_in_stock)
ELSE 0
END)
WHERE @MovieID = z
開放并感謝收到的任何建議/幫助/想法/改進。
uj5u.com熱心網友回復:
您實際上在這里嘗試做的是合并。
- 構建一個虛擬的變化源表:From 商店得到一個負數。
- 將其合并到現有表中,在該位置和電影組合沒有行的情況下插入
CREATE OR ALTER PROCEDURE MoveStock
@MovieID int,
@StoreID_From int,
@StoreID_To int,
@StockToMove int = 1;
AS
WITH Source AS (
SELECT StoreID = @StoreID_To, DiffQty = @StockToMove
UNION ALL
SELECT @StoreID_From, (-@StockToMove)
),
Target AS (
SELECT *
FROM Table1
WHERE MovieID = @MovieID
AND StoreID IN (@StoreID_From, @StoreID_To) -- this line for performance only, try without
)
MERGE Target t
USING Source s
ON s.StoreID = t.StoreID
WHEN MATCHED AND t.Movies_in_stock s.DiffQty <= 0
THEN DELETE -- decide whether you want this condition
WHEN MATCHED THEN
UPDATE SET Movies_in_stock = s.DiffQty
WHEN NOT MATCHED THEN
INSERT (StoreID, MovieID, Movies_in_stock)
VALUES (S.StoreID, @MovieID, s.DifQty)
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323269.html
標籤:sql sql-server 查询语句 存储过程
下一篇:在T-SQL中決議屬性值對
