触发查找表A中更改的列,然后使用更改的列名作为INSERT到表B

时间:2017-01-11 21:17:05

标签: sql sql-server triggers

我有一个表,每秒都会插入一个传感器的状态。它通过在表中的每一列中插入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

0 个答案:

没有答案