Sql server 2005 触发器更新中出错-SQL Server 2005

Sql server 2005 触发器更新中出错-SQL Server 2005,sql-server-2005,triggers,Sql Server 2005,Triggers,我试图在Employee表上定义一个触发器,这样,如果Employee的Salary列被更新,那么TaxDetails表中的taxdecredition列应该被更新 这是我写的触发器: create trigger tr_EmpTaxDetails On Employee For Update As if Update (Salary) Begin Declare @SSN int; Declare @Salary money; D

我试图在
Employee
表上定义一个触发器,这样,如果
Employee
Salary
列被更新,那么
TaxDetails
表中的
taxdecredition
列应该被更新

这是我写的触发器:

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
中的
SSN
属于
int
类型,就像
Taxdetails中的
EmpSSN
一样


请帮助我解决此问题

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

也许您需要这样的内容

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

您的基本缺陷是,您似乎希望触发器每行触发一次——SQL Server中的情况并非如此。相反,触发器会对每条语句触发一次,而被删除的
和插入的
伪表可能(而且将!)包含多行

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

select @SSN = i.SSN from Inserted i
它未定义-您可能从插入的
中的任意行获取值

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

因此,您的代码基本上应该是:

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
创建触发器tr\u EmpTaxDetails
关于dbo.Employee
更新
作为
更新td
设置税收扣减=(td.TaxRate/100)*i.工资
来自dbo.TaxDetails td
在i.SSN=td.EmpSSN上插入的内部联接i
d.SSN=td.EmpSSN上的内部联接已删除d
哪里
d、 Salary i.Salary--仅更新“Salary”已更改的行

触发器必须为批处理“感知”。你的不是。你知道这个触发器只有在一条记录被更新时才有效。