2011-03-19 64 views
1

我很困惑,因为我的SQL Server中的触发器无法插入我所期望的值。这种情况如下:为什么我的触发器总是在SQL Server中插入零值?

  • 我有transaction表,可以有两种类型的交易在里面 - saldobuy。如果是saldotransaction表中的触发器将把交易总额的金额插入到saldo表中,但Debit在其saldo_type字段中。

  • 因此,如果transaction表的情况下是buy,同样的金额将在其saldo_type字段中插入saldo表,但credit

什么让我困惑的是,触发只会插入的值正确的金额,如果情况是saldo,但如果情况buy

我做了什么错?这里是代码:

declare @last_saldo int 
declare @transaction_ammount int 

set @last_saldo = (select sum(saldo_ammount) from saldo) 
if @last_saldo is null set @last_saldo=0 

set @transaction_ammount = (select transaction_ammount from inserted) 
IF (select transaction_type from inserted) = 'Saldo' 
begin 
/* this will insert correct amount */ 
INSERT INTO saldo 
    (id_transaction,transaction_type,saldo_ammount,saldo) 
SELECT id_transaction,'Debit',@transaction_ammount,@last_saldo + @transaction_ammount 
FROM inserted 
RETURN 
END else IF (select transaction_type from inserted)='Buy' 
begin 
    /* this will not insert the correct ammount. It will always zero! */ 
INSERT INTO saldo 
    (id_transaction,transaction_type,saldo_ammount,saldo) 
SELECT id_transaction,'Credit',@transction_ammount,(@last_saldo - @transaction_ammount) 
FROM inserted 
RETURN 
END 

非常感谢!

+1

好的,首先 - 它的拼写“数量”只有一个“m” - 你用两个“mm”拼写错误。第二:'Inserted'表可以容纳**多于一行** - 但是,您的代码只会在该“插入”列中假设一个条目 - 您需要修复该问题! – 2011-03-19 23:16:22

+1

:)感谢您编辑错误输入的变量。实际上,代码是在印度尼西亚语中,所以在粘贴之前,我认为如果我翻译它会更好。非常感谢您指出! – swdev 2011-03-20 12:39:50

回答

1

或许你可以重构你的触发器是一个有点简单:

declare @last_saldo int 

select @last_saldo = ISNULL(sum(saldo_ammount),0) 
from saldo 

INSERT INTO saldo 
     (id_transaction,transaction_type,saldo_ammount,saldo) 

    SELECT id_transaction, 
      CASE WHEN transaction_type = 'Saldo' 
      THEN 'Debit' 
      ELSE 'Credit' 
      END, 
      transaction_ammount, 
      CASE WHEN transaction_type = 'Saldo' 
      THEN (@last_saldo + transaction_ammount) 
      ELSE (@last_saldo - transaction_ammount) 
      END 
    FROM inserted 
RETURN 

是零,此代码解决了这个问题?如果不是,请确定@last_saldotransaction_ammount的值。这会将你引向问题的根源。

注意:请注意,inserted可以有多行!

+0

:)非常感谢重写我的触发器。这是我第一次使用MS SQL触发器,我之前用My SQL做触发器。我在这里应用你的触发器,结果是一样的。但是,在我检查代码后,事实证明,我为事务ammount插入0,但后来我将它更新为正确的ammount。因为我的触发器只处理INSERT,所以......你知道发生的错误...... :) 非常感谢。我接受了这个答案,并且通过比较我的第一个触发器和你的触发器代码,我学到了很多东西。完善! – swdev 2011-03-20 12:44:55

+0

我只知道插入的可以有多行。如果是这样的话,为了使触发器符合要求,修改将会是什么?谢谢 – swdev 2011-03-20 15:47:15

+0

@swdev:这个解决方案似乎很好地处理了多行,并且在这个答案结尾处的“插入”中的多行警告只是意味着为你提供一般提醒。也就是说,每次在SQL Server中编写触发器时,请记住始终将'魔术'表'插入'和'删除'视为具有多行。 – 2011-03-20 19:24:22