【发布时间】:2016-11-20 23:28:29
【问题描述】:
当我运行一个简单的更新语句时,我不断收到这个错误。
消息 16922,级别 16,状态 1,过程 TRG_MEM_BALANCE_AWW,第 72 行
游标提取:不允许从数据类型 datetime 到十进制的隐式转换。
这是我的触发器代码。我没有看到什么转换不正确?
ALTER TRIGGER [dbo].[TRG_MEM_BALANCE_AWW]
ON [dbo].[DETAILRENTAL]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
IF(EXISTS(SELECT * FROM inserted)
AND
EXISTS(SELECT * FROM deleted))
BEGIN
DECLARE CURSORFORUPDATE CURSOR FOR
SELECT
I.RENT_NUM, I.DETAIL_DUEDATE, I.DETAIL_RETURNDATE,
I.DETAIL_DAILYLATEFEE, D.DETAIL_DUEDATE,
D.DETAIL_RETURNDATE, D.DETAIL_DAILYLATEFEE
FROM
inserted I
INNER JOIN
DELETED D ON I.Rent_Num = D.Rent_Num
AND I.Vid_Num = D.Vid_Num
DECLARE @RENT_NUM INT
DECLARE @RETURN_DATE_NEW DATETIME
DECLARE @DUE_DATE_OLD DATETIME
DECLARE @DUE_DATE_NEW DATETIME
DECLARE @RETURN_DATE_OLD DATETIME
DECLARE @DAILY_LATE_FEE_NEW DECIMAL(5,2)
DECLARE @DAILY_LATE_FEE_OLD DECIMAL(5,2)
DECLARE @LATE_FEE_PRIOR DECIMAL(5,2)
DECLARE @LATE_FEE_AFTER DECIMAL(5,2)
DECLARE @CHANGE DECIMAL (5,2)
OPEN CURSORFORUPDATE
FETCH NEXT FROM CURSORFORUPDATE INTO @RENT_NUM, @DUE_DATE_NEW, @RETURN_DATE_NEW, @DAILY_LATE_FEE_NEW, @DUE_DATE_OLD, @RETURN_DATE_OLD, @DAILY_LATE_FEE_OLD
WHILE (@@FETCH_STATUS = 0)
BEGIN
--A
IF(@RETURN_DATE_OLD > @DUE_DATE_OLD)
BEGIN
SELECT @LATE_FEE_PRIOR = DATEDIFF(DAY, @DUE_DATE_OLD, @RETURN_DATE_OLD) * @DAILY_LATE_FEE_OLD
END
ELSE
SELECT @LATE_FEE_PRIOR = 0
--B
IF(@RETURN_DATE_NEW > @DUE_DATE_NEW)
BEGIN
SELECT @LATE_FEE_AFTER = DATEDIFF(DAY, @DUE_DATE_NEW, @RETURN_DATE_NEW) * @DAILY_LATE_FEE_NEW
END
ELSE
SELECT @LATE_FEE_AFTER = 0
--C
SELECT @CHANGE = @LATE_FEE_AFTER - @LATE_FEE_PRIOR
--D
IF(@CHANGE <> 0)
BEGIN
DECLARE @MEM_NUM INT
SELECT @MEM_NUM = M.Mem_Num
FROM RENTAL R INNER JOIN MEMBERSHIP M ON R.MEM_NUM = M.MEM_NUM AND R.RENT_NUM = @RENT_NUM
UPDATE MEMBERSHIP
SET Mem_Balance = MEM_BALANCE + @CHANGE
WHERE Mem_Num = @MEM_NUM
FETCH NEXT FROM CURSORFORUPDATE
INTO @RENT_NUM, @DUE_DATE_NEW, @DUE_DATE_OLD, @RETURN_DATE_NEW, @RETURN_DATE_OLD, @DAILY_LATE_FEE_NEW, @DAILY_LATE_FEE_OLD
END
CLOSE CURSORFORUPDATE
DEALLOCATE CURSORFORUPDATE
END
END
END
我正在运行的更新是
UPDATE DETAILRENTAL
SET DETAIL_RETURNDATE = 2013-03-10
WHERE RENT_NUM = 1001
这使得电影在 DETAILRENTAL 表中返回较晚,这应该更新 MEMBERSHIP 表中的成员余额。任何有关如何解决此错误的想法将不胜感激。
【问题讨论】:
-
我添加了数据库标签。语法显然是 SQL Server。
标签: sql sql-server triggers cursor