SQL 服务器中每一行的插入触发器之前的 Oracle 等价物

Equivalent of Oracle before insert trigger for each row in SQL Server

我面临的情况有点不同。我有一个 table 名称测试,在 id 列上有主键。

以前在 Oracle 中,每当尝试插入空值(到 id 列)时,我使用 before insert 触发器分配下一个序列号。(工作正常)

CREATE OR REPLACE TRIGGER schema.trigger_name 
BEFORE INSERT ON test FOR EACH ROW WHEN (new.id is null) 
BEGIN
    SELECT sequence.nextval INTO :new.id FROM dual; 
END;

现在我想在 SQL 服务器中实现相同的目的(不改变主键)。

非常感谢你们的贡献。

我找到了解决方案。

我们可以使用

Instead off trigger to achieve this into SQL Server.

    CREATE OR ALTER TRIGGER schema_name.trigger_name
ON schema_name.table_name
INSTEAD OF INSERT
AS
BEGIN
Declare @loc_count int;
DECLARE @table_variable TABLE(LOC_ID INT);
set @loc_count=(select count(*) from inserted where inserted.id is null);

       Insert into schema_name.table_name
       select * from inserted where id is not null;

select * into #temp from inserted where id is null;


WHILE @loc_count > 0 
        BEGIN
             INSERT INTO @table_variable(LOC_ID)
             SELECT NEXT VALUE FOR schema.sequence_name;
        
        WITH  update_first_row AS
                (
                SELECT TOP 1 *
                FROM    #temp
                where id is null
                )
        update update_first_row
        set id=(SELECT LOC_ID from @table_variable)
        FROM  update_first_row;
        DELETE FROM @table_variable;
        set @loc_count=@loc_count-1;

END;
    INSERT INTO schema.table_name
    SELECT * FROM #TEMP;
    DROP TABLE #TEMP;
 
END;

我刚刚将所有 id 为 null 的行插入临时 table,然后在不更改列定义的情况下一次将序列号分配给一行。