Sql server 2012 SQL Server中触发器中的IF条件
我正在将此Oracle触发器转换为SQL Server。在Oracle中,使用if条件更新表。我想知道是否有必要在SQLServer中使用if语句。我想在where子句中使用。请让我知道这是否正确 谢谢Sql server 2012 SQL Server中触发器中的IF条件,sql-server-2012,Sql Server 2012,我正在将此Oracle触发器转换为SQL Server。在Oracle中,使用if条件更新表。我想知道是否有必要在SQLServer中使用if语句。我想在where子句中使用。请让我知道这是否正确 谢谢 CREATE OR REPLACE TRIGGER "DB1"."TG_PG_CODES" BEFORE UPDATE OF "str_number", "op_status" ON "DB1"."Header_T" REFERENCING OLD AS oldrow N
CREATE OR REPLACE TRIGGER "DB1"."TG_PG_CODES"
BEFORE UPDATE OF "str_number", "op_status"
ON "DB1"."Header_T"
REFERENCING OLD AS oldrow NEW AS newrow
FOR EACH ROW
BEGIN
IF :newrow.op_status = 'X'
THEN
UPDATE DB1.pg_pollutant
SET op_status = 'X',
str_comp_status = '98',
str_mod_person = '3327'
WHERE str_number = :newrow.str_number;
END IF;
IF :newrow.op_status <> 'X'
AND SUBSTR (:oldrow.str_pgcodes, 1, 1) = '1'
AND SUBSTR (:newrow.str_pgcodes, 1, 1) = '0'
THEN
UPDATE DB1.pg_pollutant
SET op_status = 'X',
str_comp_status = '98'
WHERE str_number = :newrow.str_number
AND str_pollutant_key = :newrow.str_number || '0';
END IF;
END;
=============================================
In sql server
CREATE TRIGGER [dbo].[TG_TG_PG_CODES] ON [dbo].[Header_T]
AFTER UPDATE
AS
IF(UPDATE(str_number)
OR UPDATE(op_status))
BEGIN
IF(
(
SELECT op_status
FROM inserted
) = 'X')
BEGIN
UPDATE a
SET
a.op_status = 'X',
a.str_comp_status = '98',
a.str_mod_person = '3327'
FROM DB1.pg_pollutant a
INNER JOIN inserted AS i ON a.str_number = i.str_number;
END;
UPDATE a
SET
a.op_status = 'X',
a.str_comp_status = '98'
FROM DB1.pg_pollutant a
INNER JOIN inserted AS i ON a.[str_number] = i.[str_number]
AND a.str_pollutant_key = i.[str_number]+'0'
INNER JOIN Deleted AS d ON a.[str_number] = d.[str_number]
WHERE i.stroperationalstatus <> 'X'
AND SUBSTRING(d.str_pgcodes, 1, 1) = '1'
AND SUBSTRING(i.str_pgcodes, 1, 1) = '0'; /* I used this condition in where clause */
END;
最大的变化是SQLServer没有针对每一行的触发器,也没有更新前触发器。每个语句只调用SQL Server触发器一次,即使该语句一次更新25行。在SQL Server中,在这种情况下,触发器中插入的伪表将包含25行,因此您需要以正确的基于集合的方式编写触发器,以解释thatHi Marc,感谢您的回答。你说的基于集合的方式是什么意思?我没有得到。你不能做像声明@ID INT;从“插入”菜单中选择@ID=ID;因为插入的表中将有多行-您必须将数据作为一个集合来处理,所以最大的变化是SQL Server没有针对每一行的数据,也没有更新前触发器。每个语句只调用SQL Server触发器一次,即使该语句一次更新25行。在SQL Server中,在这种情况下,触发器中插入的伪表将包含25行,因此您需要以正确的基于集合的方式编写触发器,以解释thatHi Marc,感谢您的回答。你说的基于集合的方式是什么意思?我没有得到。你不能做像声明@ID INT;从“插入”菜单中选择@ID=ID;因为插入的表中将有多行,所以必须将数据作为一个集合来处理