首页 > 解决方案 > 从 varchar 转换为 numeric 时出错

问题描述

我制作了一个历史表以及参考表中内置的触发函数。基于用户可能的名称更改以及记录日期。

我的触发器构建:

在此处输入图像描述

目标表:

在此处输入图像描述

触发器函数将名称从表中拉出。

在此处输入图像描述

但我在转换数据类型时遇到错误。我正在更新的所有数据都是VARCHAR类型。我在哪里失踪?

标签: sqlsql-serverdatabase-triggerhistorical-db

解决方案


INSERT..VALUES将语句更改为INSERT..SELECT并为所有列设置别名。确保别名与目标表中的每一列匹配(默认为所有NOT NULL列),并且它们的顺序与声明的顺序相同。请注意,该SELECT语句使用该patientLastNameChange表,因为MAX()没有 aGROUP BY确保只返回一行。我建议使用COALESCEMAX()结果设置为0if 它返回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;

推荐阅读