判断插入到表A的记录是否存在与B,不存在则插入(因为只有一条记录);存在的把刚刚插入DeviceName和ParamName相同的最新时间的记录更新表B;
也可以针对表A插入记录写一个存储过程,在存储过程中实现你的逻辑。

解决方案 »

  1.   

    to kuangdp:我明白你的意思,但是怎么写呀,没写过触发器
      

  2.   

    你的情况跟我初看触发器差不多,估计你先找找触发器的知识看看。当一个表被更新时,会有两个系统表: inserted 和 deleted ,这里面存放着被更新的记录,
    你的意思是在这两个表里面查找最新的记录,然后将它们添加到表B之中。
      

  3.   

    CREATE TRIGGER t ON ta
    FOR UPDATE,INSERT
    AS
    BEGIN
    TRUNCATE TABLE tb
    INSERT tb SELECT a.id,a.deviceName,a.paramName,a.value,a.time
    FROM ta a
    INNER JOIN
    (SELECT MAX(time) mt,deviceName,paramName FROM ta GROUP BY deviceName,paramName) b
    ON a.deviceName=b.deviceName AND a.paramName=b.paramName AND a.time=b.timte
    END
    当然,写法还有很多种,不一一列了。
      

  4.   


    CREATE TRIGGER t ON ta
    FOR UPDATE,INSERT
    AS
    BEGIN    -- 如果表b有对应deviceName,paramName的记录,则更新
        UPDATE a SET VALUE=b.VALUE,TIME=b.TIME
            FROM 表b a
            INNER JOIN inserted b ON a.deviceName=b.deviceName AND a.paramName=b.paramName    -- 否则插入新记录
        INSERT 表b 
            SELECT a.id,a.deviceName,a.paramName,a.value,a.time
            FROM inserted a
            LEFT JOIN 表b b ON a.deviceName=b.deviceName AND a.paramName=b.paramName
            WHERE b.deviceName IS NULL
    END
      

  5.   

    谢谢各位:我想先删除一条,然后再插入,下面写法可以吗?还有就是那种执行速度快
    CREATE TRIGGER t ON ta
    FOR INSERT
    AS
    BEGIN
      delete  from ta, inserted where ta.deviceName = inserted.deviceName and ta.paramName = inserted.paramName
      insert  ta select  id,deviceName,paramName,value,time from inserted  
    END
      

  6.   

    --> --> (Andy)生成测试数据 2008-07-20
    Set Nocount On
    if not object_id('TestA') is null
    drop table TestA
    Go
    Create table TestA([ID] int Identity(1,1) Primary Key,[DeviceName] nvarchar(3),[ParamName] nvarchar(6),[Value] int,[time] Datetime)
    Go
    if not object_id('TestB') is null
    drop table TestB
    Go
    Create table TestB([ID] int Identity(1,1) Primary Key,[DeviceName] nvarchar(3),[ParamName] nvarchar(6),[Value] int,[time] Datetime)
    Go
    If Object_id('t_testA') Is Not null
    Drop trigger t_testA
    Go
    Create Trigger t_testA On TestA
    For Insert,Update
    As
    If Object_id('tempdb..#') Is Not null
    Drop Table #
    Select * Into # From Inserted
    If Exists(Select 1 From TestB a Inner Join # b On b.DeviceName=a.DeviceName And b.ParamName=a.ParamName)
    Update a Set a.[Value]=b.[Value],a.[time]=b.[time] 
    From  TestB a 
    Inner Join # b On b.DeviceName=a.DeviceName And b.ParamName=a.ParamName
    Else
    Insert Into TestB (DeviceName,ParamName,[Value],[time])
    Select DeviceName,ParamName,[Value],[time] From #

    Go
    Insert TestA select N'ACU',N'param1',1,'2008-07-19 14:59:44'
    Insert TestA select N'ACU',N'param1',2,'2008-07-19 15:00:44'
    Insert TestA select N'ACU',N'param1',3,'2008-07-19 15:20:39'
    Insert TestA select N'ACU',N'param2',1,'2008-07-19 14:59:44'
    Insert TestA select N'ACU',N'param2',2,'2008-07-19 15:00:44' 
    Insert TestA select N'ACU',N'param2',2,'2008-07-19 15:20:39'
    Go
    Select * From TestB
    /*
    ID          DeviceName ParamName Value       time
    ----------- ---------- --------- ----------- -----------------------
    1           ACU        param1    3           2008-07-19 15:20:39.000
    2           ACU        param2    2           2008-07-19 15:20:39.000
    */