C# SQL Insert 语句 - 如果第一列有文本插入到下一列

C# SQL Insert statement - if first column has text insert into the next

我已经构建了一个 RFID 比赛计时系统并且一切正常,但现在我需要插入或更新 tblMovement 条目。

插入时必须使用tagID、movementDate、checkDate。 movementDate 是实际标签读取时间。 checkDate 用于我的防碰撞功能。插入时必须将 movementDate 放入 @Lap1.

更新时,我必须找到 tagID 并检查@Lap1、@Lap2、@Lap3、@Lap4 或@Lap5 是否有数据。如果@Lap3 有数据,那么我必须插入@Lap4 等

我的 SQL 定位 tagID 的搜索查询运行良好,它根据结果更新或插入。我最大的挑战是扫描每一列以查看哪些有数据。我有源代码,但它对这个来说太多了 window.....

最好将其分解为标准化结构,而不是 5 圈时间。这意味着 tblMovementLaps table 具有以下结构。

CREATE TABLE dbo.tblMovementLaps(
    [Id] INT NOT NULL IDENTITY(1,1),
    [TagId] INT NOT NULL,
    [MovementDate] DATETIME NOT NULL,
    [CheckDate] DATETIME NOT NULL
)

您会在每场比赛开始时将新记录插入 tblMovement,并在每次记录新圈时将新记录插入 tblMovementLap。然后您将加入两者之间以查看比赛,其中:

SELECT *
FROM [tblMovement] TM
    JOIN [tblMovementLaps] TML
    ON TM.[TagId] = TML.[Id]
ORDER BY TML.[Id] ASC

这样做的一大好处 - 它可以让您记录无限圈数的比赛,而不会破坏您的结构或将您的运动 table 扩展到越来越多的列中。此外,它还可以让您在运动中保持 space table 可用于每场比赛真正独特的信息(标准化的基础),例如赛车手 ID、比赛日期等。

综上所述,如果您真的想继续支持您当前的结构,您可以向 TblMovement 添加一个 [CurrentLap] 字段。始终将您的单圈时间插入该字段。在您的 table 上设置一个更新触发器,将该值移动到根据其填充的 @lap 字段之一