【问题标题】:Error in Trigger Update - SQL Server 2005触发器更新错误 - SQL Server 2005
【发布时间】:2014-10-09 22:38:38
【问题描述】:

我正在尝试在Employee 表上定义一个触发器,这样如果EmployeeSalary 列更新,TaxDetails 表中的TaxDeduction 列也应该更新。

这是我写的触发器:

create trigger tr_EmpTaxDetails
On Employee
For Update
As
    if Update (Salary)
    Begin
        Declare @SSN int;
        Declare @Salary money;
        Declare @TaxDeduction money;

        select @SSN = i.SSN from Inserted i
        select @Salary = Salary from Inserted where SSN = @SSN

        Update TaxDetails
        Set TaxDeduction = (TaxRate/100)* @Salary
        where EmpSSN = @SSN
    End
Go

当我执行时

update Employee
set Salary = 35000
where SSN = 12334

我收到一个错误

将 varchar 值 'Employee SSN' 转换为数据类型 int 时转换失败

但是Employee 中的SSNint 类型,就像Taxdetails 中的EmpSSN 一样

请帮我解决这个问题

【问题讨论】:

  • 触发器必须是批量“感知”的。你的不是。
  • 您确实意识到此触发器仅在更新单个记录时才有效。

标签: sql-server-2005 triggers


【解决方案1】:

我的猜测是不是 Employee 中的 SSN 列或 Taxdetails 中的 EmpSSN,而是另一列“Employee SSN”,这是转换失败的原因。请检查您的触发器中是否使用了任何列“员工 SSN”。

【讨论】:

    【解决方案2】:

    也许你想要这样的东西?

    create trigger tr_EmpTaxDetails
    On Employee
    For Update
    As
    if Update (Salary)
    
    Begin
        Update TaxDetails 
        Set TaxDeduction = (TaxRate/100) * i.Salary
        from TaxDetails td 
        inner join inserted i on td.empssn = i.SSN
    End
    Go
    

    【讨论】:

      【解决方案3】:

      您的根本缺陷是您似乎希望触发器每行触发一次 - 这在 SQL Server 中不是。相反,触发器每条语句触发一次,伪表DeletedInserted 可能(并且将!)包含多行 .

      鉴于该表可能包含多行 - 您希望此处选择哪一行??

      select @SSN = i.SSN from Inserted i
      

      它是未定义的 - 您可能会从 Inserted 中的任意行获取值。

      您需要重写整个触发器,知道Inserted 包含多行!您需要使用基于集合的操作 - 不要期望 Inserted 中只有一行!

      所以你的代码基本上应该是这样的:

      CREATE TRIGGER tr_EmpTaxDetails
      ON dbo.Employee
      FOR UPDATE
      AS        
           UPDATE td
           SET TaxDeduction = (td.TaxRate / 100) * i.Salary
           FROM dbo.TaxDetails td
           INNER JOIN Inserted i ON i.SSN = td.EmpSSN 
           INNER JOIN Deleted d ON d.SSN = td.EmpSSN 
           WHERE
              d.Salary <> i.Salary  -- update only rows where the "Salary" has changed
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 2010-09-14
        • 2011-06-03
        相关资源
        最近更新 更多