如何将 DB2 触发器转换为 SQL Server?

Posted

技术标签:

【中文标题】如何将 DB2 触发器转换为 SQL Server?【英文标题】:How to convert DB2 trigger to SQL Server? 【发布时间】:2021-05-19 04:55:10 【问题描述】:

我正在将一些 DB2 触发器转换为 SQL Server。此处显示的其中一个我正在努力解决,Conversion 在一定程度上进行了尝试,但似乎还不足以解决问题。

在更新或插入之前触发执行,并根据Select括号中的语句选择列PDE_KEY的值,并在写入数据库之前使用where子句。

需要帮助。

DB2 触发器

CREATE OR REPLACE TRIGGER "TDC" BEFORE
INSERT
    ON
    "DECL_CONSIGNMENT" REFERENCING NEW AS NEW FOR EACH ROW NOT SECURED SET
    NEW.PDE_KEY = (
    SELECT
        D.PDE_KEY
    FROM
        DECL D
    WHERE
        D.DE_KEY = NEW.DE_KEY)

此触发器的 SQL Server 转换(我的尝试):

CREATE TRIGGER [TDC]
ON [DECL_CONSIGNMENT]
INSTEAD OF INSERT
AS 
BEGIN
    DECLARE @PDE_KEY BIGINT
    SET NOCOUNT ON

    SELECT
        @PDE_KEY = D.PDE_KEY
    FROM
        DECL D
    WHERE
        D.DE_KEY = (...work upto here)
END

【问题讨论】:

您还需要解释触发器试图实现的逻辑。 在更新或插入之前触发执行,并在写入数据库之前根据括号中的Select 语句选择列PDE_KEY 的值。希望这能解释逻辑。 edit 任何澄清直接进入您的问题。 【参考方案1】:

instead of 触发器必须显式执行所需的 dml。

REATE TRIGGER [TDC]
ON [DECL_CONSIGNMENT]
INSTEAD OF INSERT
AS 
BEGIN       
    SET NOCOUNT ON;
    INSERT INTO [DECL_CONSIGNMENT] (a, b, .. PDE_KEY, ..)
    SELECT a, b, .. (
       SELECT
         D.PDE_KEY
       FROM
         DECL D
       WHERE
         D.DE_KEY = i.DE_KEY),
       ..
    FROM inserted i;
END

【讨论】:

来下面的脚本...CREATE TRIGGER [TDC] ON [DECL_CONSIGNMENT] INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO [DECL_CONSIGNMENT] (PDE_KEY) SELECT PDE_KEY ( SELECT D.PDE_KEY FROM DECL D WHERE D.DE_KEY = i.DE_KEY) FROM inserted i; END有错误...Msg 156, Level 15, Line 10 [Batch Start Line 3] Incorrect syntax near the keyword 'SELECT'. Msg 102, Level 15, State 1, Line 15 [Batch Start Line 3] Incorrect syntax near ')'

以上是关于如何将 DB2 触发器转换为 SQL Server?的主要内容,如果未能解决你的问题,请参考以下文章

包含列的 SQL Server 索引 - 转换为 Oracle

如何将 varchar(2020 年 1 月 1 日)中的日期转换为 DB2 sql 中的日期类型?

SQL Server 触发 CAST 函数

如何重写oracle SQL语句以符合ansi-98并转换为DB2格式

MySQL 触发器中的“INSTEAD OF”,从 SQL Server 转换而来

将 DB2 SQL 十进制转换为 DATE