Sql server 将Oracle SQL触发器转换为SQL Server触发器

Sql server 将Oracle SQL触发器转换为SQL Server触发器,sql-server,oracle,tsql,Sql Server,Oracle,Tsql,我曾尝试将Oracle中编写的触发器转换为SQL Server触发器。但它不允许在查询中使用表别名和:OLD关键字。你知道如何进行正确的转换吗 Oracle触发器: CREATE OR REPLACE TRIGGER TRG_DEL_AM_LABELS BEFORE DELETE on AM_LABELS FOR EACH ROW BEGIN DELETE FROM AM_LABEL_URLS ALU WHERE ALU.LABEL_ID =

我曾尝试将Oracle中编写的触发器转换为SQL Server触发器。但它不允许在查询中使用表别名和:OLD关键字。你知道如何进行正确的转换吗

Oracle触发器:

   CREATE OR REPLACE TRIGGER TRG_DEL_AM_LABELS   BEFORE DELETE on AM_LABELS
    FOR EACH ROW 
       BEGIN
         DELETE FROM AM_LABEL_URLS ALU WHERE ALU.LABEL_ID = :OLD.LABEL_ID;
       END;
已转换的SQL Server触发器:

CREATE OR ALTER TRIGGER TRG_DEL_AM_LABELS 
ON AM_LABELS    
INSTEAD OF DELETE
AS 
BEGIN
    DELETE FROM AM_LABEL_URLS ALU 
    WHERE ALU.LABEL_ID = :OLD.LABEL_ID;
END

CLOSE DELETED_CUR;
DEALLOCATE DELETED_CUR;
DELETE FROM AM_LABELS WHERE (.LABEL_ID;) IN (SELECT .LABEL_ID; FROM DELETED); 
;
这些是突然出现的错误

“:”附近的语法不正确

“ALU”附近的语法不正确


但正如文档中提供的,此查询在SQL Server中使用是有效的。

使用已删除的表访问旧值:

DML触发器语句使用两个特殊的表:删除的表和 插入的表。SQL Server自动创建和管理 这些桌子。您可以使用这些临时的内存驻留表来 测试某些数据修改的效果并设置条件 用于DML触发操作

删除的表存储删除和删除期间受影响行的副本 更新语句。在执行删除或更新期间 语句,则从触发器表中删除行并将其传输到 删除的表。删除的表和触发器表 没有共同的行


请参见

不确定键入的原因。标签\u ID;到处都是。它是从已删除中选择标签ID,而不是选择。标签ID;从已删除。谢谢,我能够解决Alies错误。但仍然无法理解:旧的关键字错误@你知道多少年可以被替换吗deleted@Chamindu答案中解释了这一点,您当前的代码中已经有了它,尽管使用了随机标点符号:SELECT LABEL_ID FROM DELETED。因此,不需要使用:OLD,而应该使用以下查询。在AM_标签上创建或更改触发器TRG_DEL_AM_标签,而不是像BEGIN DELETE ALU FROM DELETED那样删除,AM_LABEL_URL ALU,其中ALU.LABEL_ID=DELETED.LABEL_ID;结束关闭已删除的\u CUR;取消分配已删除的\u CUR;从AM_标签中删除,其中标签_ID在选择标签_ID FROM DELETED@Chamindu需要理解的关键点是Oracle通过变量公开值,SQL Server通过表公开值