我制作了一个历史表以及参考表中内置的触发函数。基于用户可能的名称更改以及记录日期。
我的触发器构建:
目标表:
触发器函数将名称从表中拉出。
但我在转换数据类型时遇到错误。我正在更新的所有数据都是VARCHAR
类型。我在哪里失踪?
我制作了一个历史表以及参考表中内置的触发函数。基于用户可能的名称更改以及记录日期。
我的触发器构建:
目标表:
触发器函数将名称从表中拉出。
但我在转换数据类型时遇到错误。我正在更新的所有数据都是VARCHAR
类型。我在哪里失踪?
INSERT..VALUES
将语句更改为INSERT..SELECT
并为所有列设置别名。确保别名与目标表中的每一列匹配(默认为所有NOT NULL
列),并且它们的顺序与声明的顺序相同。请注意,该SELECT
语句使用该patientLastNameChange
表,因为MAX()
没有 aGROUP BY
确保只返回一行。我建议使用COALESCE
将MAX()
结果设置为0
if 它返回NULL
。然后只需添加1
以增加lastNameChangeID
. 我认为这更具可读性。
CREATE TRIGGER patientLastNameChangeTrigger
ON patient
AFTER UPDATE
AS
BEGIN
DECLARE @oldLastName VARCHAR(255) = (SELECT pt_lastName FROM DELETED);
DECLARE @newLastName VARCHAR(255) = (SELECT pt_lastName FROM INSERTED);
IF @oldLastName <> @newLastName
INSERT INTO dbo.patientLastNameChange (lastnameChangeID, patientID, oldLastName, newLastName, datechanged)
SELECT
COALESCE(MAX(plnc.lastnameChangeID),0)+1 AS lastnameChangeID,
(SELECT patientID FROM INSERTED) AS patientID,
@oldLastName AS oldLastName,
@newLastName AS newLastName,
GETDATE() AS datechanged
FROM patientLastNameChange plnc;
END;