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,然后在不更改列定义的情况下一次将序列号分配给一行。
我面临的情况有点不同。我有一个 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,然后在不更改列定义的情况下一次将序列号分配给一行。