(TRIGGER) if cell1 = 'value' THEN INSERT INTO table (date) 值 (CURRENT_TIMESTAMP)
(TRIGGER) if cell1 = 'value' THEN INSERT INTO table (date) VALUES (CURRENT_TIMESTAMP)
我需要在 SQL 服务器中创建一个触发器,每次当 "status" 列的值 = 'Baja'
时触发
CREATE TRIGGER trg_triggerName
ON dbo.table1
AFTER UPDATE
AS
BEGIN
IF status = 'Baja' THEN BEGIN
INSERT INTO dbo.table1 (fechaBaja)
VALUES (CURRENT_TIMESTAMP)
END
END
GO
我收到这条错误消息
Msg 207, Level 16, State 1, Procedure trg_FechaBaja, Line 3 [Batch Start Line 34]
Invalid column name 'status'.
IF status = 'Baja' THEN BEGIN
在这一行中,"status" 给我消息 "invalid column name 'status'",我 100% 确定我的专栏有那个名字。
在简历中:得到了一个名为 table1 的 table,它有一个名为 'status' 的列和另一个名为 'fechaBaja'
的列
每次 'status' 值更改为 'Baja' 时,我需要使用 current_timestamp
触发并更新单元格 'fechaBaja'
所有操作都在同一个table1
.
我相信如果更新的行状态字段等于“Baja”,您想要更新 fechaBaja 字段。您还需要捕获主键信息。我放了 'Id' 但你需要用你的实际字段名称来改变它。
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
你可以通过像
这样的三个 table 加入来做到这一点
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
- 不需要使用
IF
。
status
为保留字,用括号括起来。
- 将您的 table 与
INSERTED
table 合并以更新所有 ID
行。
- 将您的 table 与
DELETED
table 合并以获得数据不是 'Baja'
. 的所有 ID
- 过滤
INSERTED.[status] = 'Baja' AND DELETED.[status] <> 'Baja'
以仅更新那些行。
首先,您想要 update
,而不是 insert
。
其次,SQL 服务器中的触发器每条语句触发一次,而不是每行一次。这意味着如果触发触发器的更新语句更新了多行,您的触发器将被触发一次,并将有关这些行的数据包含在 inserted
和 deleted
表中。
第三,您需要确保触发器内部的更新语句不会再次引发它。通过配置数据库来做到这一点。
您需要的代码是这样的:
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
我需要在 SQL 服务器中创建一个触发器,每次当 "status" 列的值 = 'Baja'
时触发CREATE TRIGGER trg_triggerName
ON dbo.table1
AFTER UPDATE
AS
BEGIN
IF status = 'Baja' THEN BEGIN
INSERT INTO dbo.table1 (fechaBaja)
VALUES (CURRENT_TIMESTAMP)
END
END
GO
我收到这条错误消息
Msg 207, Level 16, State 1, Procedure trg_FechaBaja, Line 3 [Batch Start Line 34]
Invalid column name 'status'.
IF status = 'Baja' THEN BEGIN
在这一行中,"status" 给我消息 "invalid column name 'status'",我 100% 确定我的专栏有那个名字。
在简历中:得到了一个名为 table1 的 table,它有一个名为 'status' 的列和另一个名为 'fechaBaja'
的列每次 'status' 值更改为 'Baja' 时,我需要使用 current_timestamp
所有操作都在同一个table1
.
我相信如果更新的行状态字段等于“Baja”,您想要更新 fechaBaja 字段。您还需要捕获主键信息。我放了 'Id' 但你需要用你的实际字段名称来改变它。
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
你可以通过像
这样的三个 table 加入来做到这一点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
- 不需要使用
IF
。 status
为保留字,用括号括起来。- 将您的 table 与
INSERTED
table 合并以更新所有ID
行。 - 将您的 table 与
DELETED
table 合并以获得数据不是'Baja'
. 的所有 - 过滤
INSERTED.[status] = 'Baja' AND DELETED.[status] <> 'Baja'
以仅更新那些行。
ID
首先,您想要 update
,而不是 insert
。
其次,SQL 服务器中的触发器每条语句触发一次,而不是每行一次。这意味着如果触发触发器的更新语句更新了多行,您的触发器将被触发一次,并将有关这些行的数据包含在 inserted
和 deleted
表中。
第三,您需要确保触发器内部的更新语句不会再次引发它。通过配置数据库来做到这一点。
您需要的代码是这样的:
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