摘要: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入門基礎:定位修改刪除游標