我有一个表,每秒都会插入一个传感器的状态。它通过在表中的每一列中插入0或1来完成此操作。无论如何,它每秒都会插入一次。目前只有10个左右的列,但在不久的将来会增加到100个左右。表格详情如下。我知道这是一种存储这些数据的可怕方法,但我无法控制这些数据的插入方式。
我想使用后插入触发器来查看哪些列已从0更改为1并将记录插入到新表中,详细信息如下所示,旧表列名称在名为MACHINE的字段中更改名为START的列中的当前时间戳。我还希望触发器监视已从1更改为0的列,并通过将名为STOP的列更改为当前时间戳来对新表执行更新。通过这种方式,我结束了一个新的表格,其中包含传感器所处的开始和停止时间,然后我可以每天从旧桌子上删除一天以上的记录以保持较小。
使用插入或删除执行常规触发器我已经完成但循环遍历列然后使用实际列名作为新表中行的数据听起来令人生畏。如果没有编写代码页,这可能吗?
旧表列 - ID,ENTRYTIME,MACHINENAME(其中许多列名称略有不同)
新表格列 - ID,MACHINENAME,START,STOP
我希望我解释得这么好。谢谢你的帮助。
更新:添加了一些原始数据并采用了新的表格布局
ID DATETIME M1L1 M1L2 M1L3 M2L1 M2L2 M2L3 M2L4
1 10:25.01 0 0 0 0 0 0 1
2 10:26.02 0 0 0 0 0 0 1
3 10:27.03 0 0 1 0 0 0 1
4 10:28.04 0 0 1 0 0 0 1
5 10:29.05 0 1 0 0 0 0 0
6 10:30.06 0 1 0 0 0 1 0
7 10:31.07 0 1 0 0 0 1 0
8 10:32.08 0 1 0 0 0 1 0
9 10:33.09 0 0 0 0 0 1 0
10 10:34.10 0 0 0 0 0 1 0
11 10:35.11 0 0 0 0 0 1 0
12 10:36.12 0 0 0 0 0 1 0
13 10:37.13 0 0 0 0 1 1 0
新表将是:
CREATE TABLE Table_B
[ID] [int] IDENTITY(1,1) NOT NULL,
[MACHINENAME] [nchar](10) NOT NULL,
[START] [datetime] NOT NULL,
[STOP] [datetime] NULL
或者新表可以是:
CREATE TABLE Table_B
[ID] [int] IDENTITY(1,1) NOT NULL,
[MACHINENAME] [nchar](10) NOT NULL,
[START] [datetime] NOT NULL,
[DURATION] [time] NULL
其中[DURATION]是传感器的计算时间长度" 1"
我还把一个不起作用的触发器扔在一起,但应该把我的想法押在我想要的东西上(也许)。
CREATE TRIGGER TR_FIND_CHANGES
ON TABLE_A
AFTER INSERT
AS
BEGIN
INSERT INTO TABLE_B
SELECT TABLE_A.MACHINENAME, --NEED TO CYCLE THROUGH ALL COLUMNS
CURRENT_TIMESTAMP AS [START]
FROM INSERTED A JOIN
TABLE_A A ON INSERTED.ID = A.ID - 1 --MATCH INSERTED ROW ID TO PREVIOUS ROW ID
WHERE INSERTED.MACHINENAME > A.MACHINENAME --LOOK FOR WHEN CHANGED FROM 0 TO 1
UPDATE TABLE_B
SET TABLE_B.[STOP] = CURRENT_TIMESTAMP
FROM INSERTED A JOIN
TABLE_A A ON INSERTED.ID = A.ID - 1 --MATCH INSERTED ROW ID TO PREVIOUS ROW ID
WHERE INSERTED.MACHINENAME < A.MACHINENAME --LOOK FOR WHEN CHANGED FROM 1 TO 0
END