【发布时间】:2015-11-27 00:57:42
【问题描述】:
正在寻找一种方法来做到这一点是 SQL Server
表 1 - Status_Latest
DeviceID Status(bit) TimeOfUpdate(datetime)
表 2 - Status_History
DeviceID Status(bit) TimeOfUpdate(datetime)
寻找最快的实现方式:
调用存储过程,传递DeviceID 和状态。
如果Status_Latest 中不存在DeviceID,请同时插入Status_Latest 和Status_History
如果值与Status_Latest 中的当前值不同,请更新它
并存储到Status_History
我在想
选项 A:如果值不同,我可以从 Status_Latest 中进行选择,然后更新 Status_Latest 和 Status_History。
选项 B:我可以在存储旧值的同时更新 Status_Latest?
如果值不同更新Status_Latest 和Status_History
到目前为止我所拥有的(仅在应用程序更改时调用,需要在 DB 存储过程中处理)
insert into [SensorStateChange_History] (SensorIndex, SensorOccupied, TimeOfDataBaseStorage)
values (@SensorIndex, @SensorOccupied, GETUTCDATE())
update SensorState_Latest
set SensorOccupied = @SensorOccupied,
TimeOfDataBaseStorage = GETUTCDATE()
and SensorIndex = @SensorIndex
if @@ROWCOUNT = 0
insert into SensorState_Latest
values (@SensorIndex, @SensorOccupied, GETUTCDATE())
【问题讨论】:
-
这里的问题是什么?您发布的内容应该可以正常工作。
-
每次调用存储过程时都会在表中存储一个值。我希望存储过程仅在值与最新值不同时才存储历史记录
-
那么你只需要在更新中添加额外的条件。
-
什么额外条件?返回之前的值?
-
在更新语句中添加一个额外的谓词。我假设您的意思是sensoroccuied的值?只需添加“And SensorOccupied @SensorOccupied”或您想知道它是否更改的任何值。
标签: sql sql-server stored-procedures database-design