TSQL触发未知列

时间:2015-12-03 16:12:14

标签: sql-server tsql triggers compare

我有一个包含31列的表 PrimaryField,PersNr,a1,a2,a3,a4,... 在a1 - a31字段中是值。该软件每个月自动生成一行。 用户现在可以从软件更新字段或删除它(更新为NULL)。

但是现在我需要一个Trigger,它会在每个更改字段的新表中插入一个。问题是前一行和更改行的比较。如何在用户更新行时获取更改的字段?

3 个答案:

答案 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触发器中,您可以访问InsertedDeleted伪表;那些保留已修改的数据:第一个存储新值,第二个存储旧值。

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);
...
  1. 比较每个@ai和@ad

    如果不是@ ai1 = @ ad1 OR(@ ai1 IS NULL且@ ad1 IS NOT NULL)或(@ ai1 IS NOT NULL且@ ad1为NULL) 开始 ... 插入... 结束 如果不是@ ai2 = @ ad2 ...

  2. 这就是诡计。但是非常感谢你们!