Получение ошибки при конвертации из varchar в числовой

Я сделал историческую таблицу вместе с функцией триггера, встроенной в справочную таблицу. Основывается на возможных изменениях имени пользователя, а также на записи даты.

Мой триггер построен:

Целевой стол:

Функция триггера снимает имена со стола.

Но я получаю ошибку при преобразовании типа данных. Все мои данные, которые я обновляю, имеют VARCHAR тип. Куда я скучаю?

1 ответ

Решение

Изменить INSERT..VALUES заявление к INSERT..SELECT и установите псевдонимы для всех столбцов. Убедитесь, что псевдонимы соответствуют каждому столбцу в целевой таблице (по умолчанию все NOT NULL столбцы), и они находятся в том же порядке, в котором они объявлены. Обратите внимание, что SELECT заявление использует patientLastNameChange стол, потому что MAX() без GROUP BY гарантирует, что возвращается только одна строка Я рекомендую использовать COALESCE установить MAX() привести к 0 если он вернется 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;
Другие вопросы по тегам