- MS SQL不支持
BEFORE
觸發器。你應該使用INSTEAD OF
觸發器。
- 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
這裏是SQLFiddle演示
如果您想模擬零件WHEN (NEW."Id" IS NULL OR 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
這裏是SQLFiddle演示了這種情況下
什麼功能'NVL'嗎? –
檢查「Id」是否爲空 – Rock