如何将 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 中的日期类型?
如何重写oracle SQL语句以符合ansi-98并转换为DB2格式