触发器:将新插入的列中的空值替换为SAME行中的另一个列值



假设我有一个包含以下列的表:

PrimaryKey | Celsius (float) | Fahrenheit (float) | 

这两个单位值可以相互转换,但在任何给定时间,只有一个单位用于数据采集,这意味着另一个单位将记录为空。

我需要将新插入中记录的null值转换为记录值的转换值,以便将这两个值与条目一起存储。

到目前为止,我得到了这样的东西:

CREATE TRIGGER Temp_switch 
ON DATASET
FOR INSERT
AS    
DECLARE @Temp_C float,
@Temp_F float
SET @Temp_C = (SELECT Temperature_C FROM inserted)
SET @Temp_F = (SELECT Temperature_F FROM inserted)
BEGIN
SET NOCOUNT ON
UPDATE DATASET
SET DATASET.Temperature_F = (@Temp_C * 1.8) + 32
FROM DATASET 
INNER JOIN inserted ON DATASET.DatasetId = inserted.DatasetId
WHERE @Temp_F IS NULL
UPDATE DATASET
SET DATASET.Temperature_C = (@Temp_F - 32)/1.8
FROM DATASET 
INNER JOIN inserted ON DATASET.DatasetId = inserted.DatasetId
WHERE @Temp_C IS NULL
END

然后我尝试了一些使用Coalesce的东西:

CREATE TRIGGER Temp_switch ON DATASET
FOR INSERT
AS
BEGIN
UPDATE DATASET
SET Temperature_F = COALESCE(i.Temperature_F, (i.Temperature_C * 1.8) + 32),
Temperature_C = COALESCE(i.Temperature_C, (i.Temperature_C - 32) / 1.8)
FROM DATASET d INNER JOIN
inserted i
ON d.DatasetId = i.DatasetId
WHERE i.Temperature_F IS NULL OR i.Temperature_C IS NULL;
END;

当单位为摄氏度时,这两个值都会填充Temperature_F列,但所有Temperature-F值都是相同的,就好像它们都从插入的行中获得了相同的摄氏度参考值一样——每个条目都应该发生变化,因为将数据输入DATASET表的存储过程一次只添加一行。我只剩下这样的东西(虚构的例子(:

SessionId | Celsius (float) | Fahrenheit (float) | 
3 |         22.0    |              84.00 |
3 |         24.5    |              84.00 | 
3 |         23.0    |              84.00 | 
3 |         25.5    |              84.00 | 
3 |         23.0    |              84.00 |  

所以我需要一个可以引用同一行插入的摄氏度或华氏度值的东西,并根据这个值计算另一列。有什么想法吗?

触发器中有一个拼写错误:

CREATE TRIGGER Temp_switch ON DATASET
FOR INSERT
AS
BEGIN
UPDATE DATASET
SET Temperature_F = COALESCE(i.Temperature_F, (i.Temperature_C * 1.8) + 32),
Temperature_C = COALESCE(i.Temperature_C, (i.Temperature_F - 32) / 1.8)
---------------------------------------------------------^
FROM DATASET d INNER JOIN
inserted i
ON d.DatasetId = i.DatasetId
WHERE i.Temperature_F IS NULL OR i.Temperature_C IS NULL;
END;

我认为问题在于之前的触发器没有被删除。但这里有一个db<>小提琴表明这是有效的。

最新更新