Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从varchar转换为numeric时出错_Sql_Sql Server_Database Trigger_Historical Db - Fatal编程技术网

Sql 从varchar转换为numeric时出错

Sql 从varchar转换为numeric时出错,sql,sql-server,database-trigger,historical-db,Sql,Sql Server,Database Trigger,Historical Db,我制作了一个历史表,并在参考表中构建了一个触发器函数。基于用户可能的名称更改以及记录日期 我的触发器: 目标表: 触发器函数从表中提取名称 但我在转换数据类型时出错。我正在更新的所有数据都是VARCHAR类型的。我在哪里丢失了?将INSERT..VALUES语句更改为INSERT..SELECT并设置所有列的别名。确保别名与目标表中默认为所有非空列的每一列匹配,并且它们的顺序与声明的顺序相同。 请注意,SELECT语句使用patientLastNameChange表,因为没有GROUPBY的MA

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

我的触发器:

目标表:

触发器函数从表中提取名称

但我在转换数据类型时出错。我正在更新的所有数据都是VARCHAR类型的。我在哪里丢失了?

将INSERT..VALUES语句更改为INSERT..SELECT并设置所有列的别名。确保别名与目标表中默认为所有非空列的每一列匹配,并且它们的顺序与声明的顺序相同。 请注意,SELECT语句使用patientLastNameChange表,因为没有GROUPBY的MAX确保只返回一行。 如果MAX result返回NULL,我建议使用COALESCE将其设置为0。然后简单地添加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;

第一个注意事项:在没有WHERE子句的情况下从DELETED/INSERTED中选择Col不会执行我们认为它可以执行的操作,甚至不会执行预期的操作,尤其是当删除的行>1时。您使用的是什么版本?我使用的是SQL SERVER 17.9。如果您试图在int列中插入varchar,则会出现此错误,您试图在patientid中插入@oldlastname。SQL Server尝试将@oldlastname中的字符串强制转换为数字,但失败。另外,您需要避免使用MAX+1,因为如果删除一些行,这将不起作用,并且您需要加入表而不是使用这些变量。除了使用MAX+1,还有什么其他选项?我需要它来增加历史表中的主键。@Dan。使用标识列—让数据库为您完成工作。