Sql server 将oracle触发器转换为ms sql触发器

Sql server 将oracle触发器转换为ms sql触发器,sql-server,oracle,triggers,Sql Server,Oracle,Triggers,我有一个oracle触发器: CREATE OR REPLACE TRIGGER "BI_Info" BEFORE INSERT ON "Info" FOR EACH ROW WHEN (NEW."Id" IS NULL OR NEW."Id" = 0) BEGIN SELECT NVL(MAX("Id")+1, 1) INTO :NEW."Id" FROM "Info"; END; 现在我想把它转换成ms sql触发器 我知道[Id][int]IDENTITY1,1可以类似地实

我有一个oracle触发器:

CREATE OR REPLACE TRIGGER  "BI_Info" 
BEFORE INSERT ON "Info" FOR EACH ROW
 WHEN (NEW."Id" IS NULL OR NEW."Id" = 0) BEGIN
    SELECT NVL(MAX("Id")+1, 1) INTO :NEW."Id" FROM "Info";
END;
现在我想把它转换成ms sql触发器

我知道[Id][int]IDENTITY1,1可以类似地实现此触发器

但我不希望Id自动添加一个

谢谢

MS SQL不支持BEFORE触发器。您应该使用而不是触发器。 MS SQL触发器是基于集合的而不是基于行的触发器,因此应该考虑到这一点 尽管如此,你还是可以试一试

CREATE TRIGGER tg_BI_Info_insert ON BI_Info
INSTEAD OF INSERT AS
BEGIN
  DECLARE @max INT

  SET @max = (SELECT COALESCE(MAX(id), 0) FROM BI_Info WITH (TABLOCKX, HOLDLOCK))

  INSERT INTO BI_Info (id, column1, ...)
  SELECT @max + ROW_NUMBER() OVER (ORDER BY (SELECT 1)), column1, ...
    FROM INSERTED
END
这是演示

如果希望在NEW.Id为NULL或NEW.Id=0时模拟部件,允许插入显式分配的Id,则

CREATE TRIGGER tg_BI_Info_insert ON BI_Info
INSTEAD OF INSERT AS
BEGIN
  DECLARE @max INT

  INSERT INTO BI_Info
  SELECT * 
    FROM INSERTED
   WHERE COALESCE(id, 0) <> 0

  SET @max = (SELECT COALESCE(MAX(id), 0) FROM BI_Info WITH (TABLOCKX, HOLDLOCK))

  INSERT INTO BI_Info (id, column1)
  SELECT @max + ROW_NUMBER() OVER (ORDER BY (SELECT 1)), column1
    FROM INSERTED
   WHERE COALESCE(id, 0) = 0
END

下面是这种情况的演示

NVL函数的作用是什么?检查Id是否为空