Sql server (触发)如果cell1=';价值';然后将值(当前时间戳)插入表(日期)

Sql server (触发)如果cell1=';价值';然后将值(当前时间戳)插入表(日期),sql-server,triggers,database-trigger,Sql Server,Triggers,Database Trigger,我需要在SQL Server中创建一个触发器,每当“status”列中的值=“Baja”时触发该触发器 我收到了这个错误信息 味精207,16级,状态1,程序trg_FechaBaja,第3行[批次起始行34] 列名“status”无效 在这一行中,“status”给了我消息“invalid column name‘status’”,我100%确定我的列有这个名称 在RESUME中:得到一个名为table1的表,其中一列名为“status”,另一列名为“fechaBaja” 每次“status”

我需要在SQL Server中创建一个触发器,每当“status”列中的值=“Baja”时触发该触发器

我收到了这个错误信息

味精207,16级,状态1,程序trg_FechaBaja,第3行[批次起始行34]
列名“status”无效

在这一行中,“status”给了我消息“invalid column name‘status’”,我100%确定我的列有这个名称

在RESUME中:得到一个名为table1的表,其中一列名为“status”,另一列名为“fechaBaja”

每次“status”值更改为“Baja”时,我都需要触发单元格“fechaBaja”,并使用
当前时间戳更新该单元格


所有操作都在同一个
表1

我相信如果更新的行状态字段等于'Baja',您需要更新fechaBaja字段。您还需要捕获主键信息。我输入了“Id”,但您需要用actuel字段名更改它

 CREATE TRIGGER trg_triggerName ON dbo.table1 
 AFTER UPDATE AS
 BEGIN

        UPDATE dbo.table1 SET fechaBaja=CURRENT_TIMESTAMP 
        WHERE EXISTS (SELECT 1 FROM INSERTED I WHERE dbo.table1.Id = I.Id AND I.Status='Baja')

 END
 GO

您可以通过如下方式连接三个表

CREATE TRIGGER trg_triggerName ON dbo.table1 AFTER UPDATE AS
 BEGIN
     UPDATE T1
     SET T1.fechaBaja = CURRENT_TIMESTAMP
     FROM dbo.table1 T1 INNER JOIN INSERTED T2 ON T1.ID = T2.ID
                        INNER JOIN DELETED  T3 ON T1.ID = T3.ID
     WHERE T2.[status] = 'Baja'
           AND
           (T3.[status] <> 'Baja' OR T3.[status] IS NULL);
 END
 GO
更新为后在dbo.table1上创建触发器trg\u triggerName 开始 更新T1 设置T1.fechaBaja=当前时间戳 从dbo.table1 T1内部联接在T1.ID=T2.ID上插入T2 T1.ID=T3.ID上的内部联接已删除T3 其中T2.[状态]=“巴哈” 和 (T3.[状态]“巴哈”或T3.[状态]为空); 终止 去
  • 如果,则无需使用
  • status
    是保留字,请将其括在括号中
  • 使用插入的
    表连接您的表,以更新所有行的
    ID
    s
  • 使用
    已删除的
    表加入您的表,以获取所有
    ID
    s,其中数据不是
    'Baja'
  • 按插入的位置进行筛选。[status]='Baja'和删除的位置。[status]'Baja'仅更新这些行

首先,您需要的是
更新
,而不是
插入

其次,SQL Server中的触发器在每条语句中触发一次,而不是每行触发一次。这意味着,如果触发触发器的update语句更新了多行,则触发器将被触发一次,并在插入的
和删除的
表中包含有关这些行的数据

第三,您需要确保触发器内的update语句不会再次引发它。通过配置数据库来实现这一点

您需要的代码如下所示:

 CREATE TRIGGER trg_triggerName ON dbo.table1 
     AFTER UPDATE AS
 BEGIN

     UPDATE t
     SET fechaBaja = CURRENT_TIMESTAMP
     FROM dbo.table1 As T
     INNER JOIN Inserted As I
         ON T.<PrimaryKey> = I.<PrimaryKey>
     INNER JOIN Deleted As D
         ON T.<PrimaryKey> = D.<PrimaryKey>
     WHERE I.[status] = 'Baja'
     AND (D.[Status] IS NULL OR D.[Status] <> 'Baja')

 END
 GO
在dbo.table1上创建触发器trg\u triggerName
更新后为
开始
更新t
设置fechaBaja=当前时间戳
来自dbo.table1作为T
内部联接插入为I
关于T.=I。
内部联接已作为D删除
关于T.=D。
其中I.[状态]=“巴哈”
和(D.[Status]为空或D.[Status]'Baja')
终止
去

是的,您有该列,但插入表的位置和哪一行?删除的表?表1?您需要检查插入的
表。请解释你想做什么还有状态是一个保留字。。。所以最好将它括在括号中,或者不要在allhi@Sami中将它用作列名,它在表1中,实际上所有操作都是这样。关于行,这是否意味着每次我执行此操作时,所有行都会受到影响?@HiramL。由于触发器是在更新后触发的,因此需要检查插入的
表而不是
dbo.table1
,还需要更改代码以处理多行。我建议您编辑您的问题并添加表中的DDL,并解释您试图在表中执行的操作您是对的@Sami。我已经更新了触发器以覆盖多个更新。@ZekiGumus感谢您的帮助,此触发器工作正常,现在我遇到了问题,因为此表的另一个更新后触发器会影响其他列,但感谢您,这是我在找您,小姐
<代码>和(D.[Status]为空或D.[Status]'Baja')
CREATE TRIGGER trg_triggerName ON dbo.table1 AFTER UPDATE AS
 BEGIN
     UPDATE T1
     SET T1.fechaBaja = CURRENT_TIMESTAMP
     FROM dbo.table1 T1 INNER JOIN INSERTED T2 ON T1.ID = T2.ID
                        INNER JOIN DELETED  T3 ON T1.ID = T3.ID
     WHERE T2.[status] = 'Baja'
           AND
           (T3.[status] <> 'Baja' OR T3.[status] IS NULL);
 END
 GO
 CREATE TRIGGER trg_triggerName ON dbo.table1 
     AFTER UPDATE AS
 BEGIN

     UPDATE t
     SET fechaBaja = CURRENT_TIMESTAMP
     FROM dbo.table1 As T
     INNER JOIN Inserted As I
         ON T.<PrimaryKey> = I.<PrimaryKey>
     INNER JOIN Deleted As D
         ON T.<PrimaryKey> = D.<PrimaryKey>
     WHERE I.[status] = 'Baja'
     AND (D.[Status] IS NULL OR D.[Status] <> 'Baja')

 END
 GO