Sql 从varchar转换为numeric时出错
我制作了一个历史表,并在参考表中构建了一个触发器函数。基于用户可能的名称更改以及记录日期 我的触发器: 目标表: 触发器函数从表中提取名称 但我在转换数据类型时出错。我正在更新的所有数据都是VARCHAR类型的。我在哪里丢失了?将INSERT..VALUES语句更改为INSERT..SELECT并设置所有列的别名。确保别名与目标表中默认为所有非空列的每一列匹配,并且它们的顺序与声明的顺序相同。 请注意,SELECT语句使用patientLastNameChange表,因为没有GROUPBY的MAX确保只返回一行。 如果MAX result返回NULL,我建议使用COALESCE将其设置为0。然后简单地添加1以增加lastNameChangeID。我认为这更具可读性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
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。使用标识列—让数据库为您完成工作。