我有一个包含31列的表 PrimaryField,PersNr,a1,a2,a3,a4,... 在a1 - a31字段中是值。该软件每个月自动生成一行。 用户现在可以从软件更新字段或删除它(更新为NULL)。
但是现在我需要一个Trigger,它会在每个更改字段的新表中插入一个。问题是前一行和更改行的比较。如何在用户更新行时获取更改的字段?
答案 0 :(得分:0)
以下是一些可以运行的代码:
CREATE TRIGGER TriggerName --The name of your trigger
ON Table1 --The table where the update happens
AFTER UPDATE
AS
INERT INTO --you new tabe namegoes here
()--your new table fields go here
SELECT --only the fields you have in the parenthesis above in the same order
FROM Inerted I
大多数触发器的方式是,一旦更新或删除了一个值的插件,触发器就会有一个特殊的值,在这种情况下,fr更新和插入的操作会将表称为Inserted,它将获取输入的最新值。 / p>
答案 1 :(得分:0)
在SQL Server触发器中,您可以访问Inserted
和Deleted
伪表;那些保留已修改的数据:第一个存储新值,第二个存储旧值。
CREATE TRIGGER [dbo].[MyTableUpdate
ON [dbo].[MyTable]
AFTER UPDATE
AS
IF @@ROWCOUNT = 0
RETURN
IF NOT UPDATE (a1) AND NOT UPDATE(a2) AND NOT UPDATE(a3) AND NOT UPDATE...
RETURN
SELECT YourCOlumns FROM Inserted
SELECT YourColumsn FROM Deleted
--Compare the values as you prefer
答案 2 :(得分:0)
谢谢大家的帮助。 在我站起来的早晨,我得到了一个想法:)
重点是: 1.声明和设置变量:
DECLARE @ai1 VARCHAR(30);
DECLARE @ad1 VARCHAR(30);
....
SET @ai1 = (SELECT a1 from inserted);
SET @ad1 = (SELECT a1 from deleted);
...
比较每个@ai和@ad
如果不是@ ai1 = @ ad1 OR(@ ai1 IS NULL且@ ad1 IS NOT NULL)或(@ ai1 IS NOT NULL且@ ad1为NULL) 开始 ... 插入... 结束 如果不是@ ai2 = @ ad2 ...
这就是诡计。但是非常感谢你们!