SQL - 使用 CURRENT OF 來 UPDATE 或 DELETE

摘要:SQL - 使用 CURRENT OF 來 UPDATE 或 DELETE

CURSOR、UPDATE 與 DELETE 想必大家都用過,在使用 T-SQL 時經常性的出現他們的身影。但用了那麼久,沒像到有亂入的傢伙,那就是「CURRENT OF」,以下就來寫的小範例唄...

步驟一:建立「DBO.商品主檔」與「DBO.商品購買記錄」資料表


步驟二:新增資料並查詢一下資料
Code:

INSERT INTO DBO.商品主檔 (商品編號, 商品名稱, 商品單價) VALUES('1001', '高級錢包', 1900);
INSERT INTO DBO.商品主檔 (商品編號, 商品名稱, 商品單價) VALUES('1002', '潮流腰包', 999);

INSERT INTO DBO.商品購買記錄 ([UID], 客戶名稱, 客戶電話, 商品編號, 購買價格, 購買日期)
VALUES(NEWID(), '張小呆', '0911111111', '1001', 1900, GETDATE());

INSERT INTO DBO.商品購買記錄 ([UID], 客戶名稱, 客戶電話, 商品編號, 購買價格, 購買日期)
VALUES(NEWID(), '邱小胖', '0911222222', '1002', 999, GETDATE());

INSERT INTO DBO.商品購買記錄 ([UID], 客戶名稱, 客戶電話, 商品編號, 購買價格, 購買日期)
VALUES(NEWID(), '張大媽', '0911888888', '1002', 999, GETDATE());



步驟三:將 1002 的商品價格 * 0.8

Code:

DECLARE C_DATA CURSOR FOR
    SELECT 購買價格
 FROM DBO.商品購買記錄
 WHERE 商品編號 = '1002';
OPEN C_DATA

FETCH NEXT FROM C_DATA

WHILE @@FETCH_STATUS = 0
BEGIN

 UPDATE DBO.商品購買記錄
 SET 購買價格 = FLOOR(購買價格 * 0.8)
 FROM DBO.商品主檔
 WHERE CURRENT OF C_DATA

 FETCH NEXT FROM C_DATA
END

CLOSE C_DATA

DEALLOCATE C_DATA

步驟四:將有買商品 1001 的刪除

Code:

DECLARE C_DATA CURSOR LOCAL FOR
    SELECT 購買價格
 FROM DBO.商品購買記錄
 WHERE 商品編號 = '1001';
OPEN C_DATA

FETCH FROM C_DATA

DELETE DBO.商品購買記錄
FROM DBO.商品主檔
WHERE CURRENT OF C_DATA

CLOSE C_DATA

DEALLOCATE C_DATA

結果:

將 1002 的商品價格 * 0.8


將有買商品 1001 的刪除


※呆言呆語:這個範例想了很久,不曉得是否符合這個主題,若有看倌有更好的建議的話,再煩請指教...

參考:
DELETE (Transact-SQL)
UPDATE (Transact-SQL)
FLOOR (Transact-SQL)
MS SQL入門基礎:定位修改刪除游標