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”已更改的行
触发器必须为批处理“感知”。你的不是。你知道这个触发器只有在一条记录被更新时才有效。