Sql server 2012 SQL Server中触发器中的IF条件

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

我正在将此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 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;因为插入的表中将有多行,所以必须将数据作为一个集合来处理