我正在尝试创建一个触发器,以从另一个数据库上的一个表中复制一个从一个表中,但在同一服务器上的另一个表中,并将仅存在于表上的列中递增正在添加新行。我不确定代码是否准确,并且想要有关如何改进其的任何反馈。
CREATE TRIGGER AddReTncyTransStatement
ON [DBAdmin].[dbo].[ReTncyTransStatement]
AFTER UPDATE, INSERT
AS
BEGIN
INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
([ORG-CODE], [TNCY-SYS-REF], [TRANS-NO], [PROGRESS-RECID])
SELECT
[ORG-CODE],
[TNCY-SYS-REF],
[TRANS-NO],
[ANALYSIS-CODE] ``,
(SELECT MAX([PROGRESS-RECID])
FROM [DBAdmin].[dbo].[ReTncyTransStatement]) + 1 AS RECID
FROM
[SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
END;
我想您有一个名为 [RE-TNCY-TRANS]
的表,该表位于 [SQLViewsPro2EOD]
数据库中,另一个表是位于[DBAdmin]
数据库内的[ReTncyTransStatement]
。
我还想您每次将记录插入[RE-TNCY-TRANS]
中时,您想将记录插入[ReTncyTransStatement]
。因此,要实现此目的,您需要按下以下触发器:
CREATE TRIGGER AddReTncyTransStatement
ON [SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
AFTER UPDATE, INSERT
AS
BEGIN
INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
(
[ORG-CODE],
[TNCY-SYS-REF],
[TRANS-NO],
[PROGRESS-RECID]
)
SELECT [ORG-CODE],
[TNCY-SYS-REF],
[TRANS-NO],
ISNULL((
SELECT MAX([PROGRESS-RECID]) FROM [DBAdmin].[dbo].[ReTncyTransStatement]
),0) + 1 AS RECID
FROM Inserted;
END;
update
为什么我使用isnull函数?
因为第一次,[DBAdmin].[dbo].[ReTncyTransStatement]
表中没有记录,因此MAX([PROGRESS-RECID])
将无效。我使用ISNULL
处理这种情况。
为什么我使用inserted
?
根据Microsoft文档:
插入的表存储插入过程中受影响行的副本 和更新语句。在插入或更新交易期间,新的 行均添加到插入的表和触发表中。这 插入表中的行是触发器中新行的副本 表。
在这里阅读更多信息:https://learn.microsoft.com/en-us/sql/relational-database/triggers/triggers/use-the-the--instered-and-deleted-tables?view = sql-server-2017