Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL触发器未知列_Sql Server_Tsql_Triggers_Compare - Fatal编程技术网

Sql server TSQL触发器未知列

Sql server TSQL触发器未知列,sql-server,tsql,triggers,compare,Sql Server,Tsql,Triggers,Compare,我有一个有31列的表 主机场,人事部,a1,a2,a3,a4。。。 在a1-a31字段中是值。软件每月自动生成一行。 用户现在可以从软件更新字段或删除它(更新为NULL) 但是现在我需要一个触发器,它为每个更改的字段在新表中插入一个。问题是比较前一行和更改的行。当用户更新行时,如何获取已更改的字段?以下是一些可以运行的代码: CREATE TRIGGER TriggerName --The name of your trigger ON Table1 --The table where the

我有一个有31列的表 主机场,人事部,a1,a2,a3,a4。。。 在a1-a31字段中是值。软件每月自动生成一行。 用户现在可以从软件更新字段或删除它(更新为NULL)


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

以下是一些可以运行的代码:

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 update和inserted操作称为inserted,该表将获取输入的最新值。

在SQL Server触发器中,您可以访问
插入的
删除的
伪表;它们保留已修改的数据:第一个存储新值,第二个存储旧值

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

谢谢大家帮助我。 早上,当我站起来时,我有了一个想法:)

重点是: 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或(@ai1为空且@ad1为非空)或(@ai1为非空且@ad1为空) 开始 ... 插入。。。 结束 如果不是@ai2=@ad2


  • 这就是诀窍。但是非常感谢大家

    你可以用扳机代替扳机。然后可以比较表中的值(旧)和插入的值(新)。然后,您必须使用inserted来进行插入,因为使用inserted而不是会停止插入。理想情况下,您可以更改表格设计。相同“类型”的数据应存储在同一列中。添加一个额外的列,以便当前嵌入在列名中的日数可以在数据中正确地占据其位置。将数据的数据透视放在电子表格布局中,交给报表处理器处理。这是一个坏的触发器<代码>插入的和
    删除的
    可能包含0行、1行或多行。在后一种情况下,您甚至不能保证
    @ai1
    @ad1
    已从行前/行后的“相同”赋值。