SQL更新(如果存在且较旧),否则插入

SQL更新(如果存在且较旧),否则插入,sql,sql-server-2008,Sql,Sql Server 2008,我在SQL 2008中得到了一个如下所示的表: DECLARE @DataTable TABLE ( Name varchar(10), [TimeStamp] DateTime, Event varchar(10), Data varchar(10) ) INSERT INTO @DataTable VALUES ('TEST01', '2012/03/06 10:00', 'EventA', 1), ('TEST01', '2012/03/

我在SQL 2008中得到了一个如下所示的表:

DECLARE @DataTable TABLE
(
    Name varchar(10),
    [TimeStamp] DateTime,
    Event varchar(10),
    Data varchar(10)
)

INSERT INTO @DataTable
VALUES  ('TEST01', '2012/03/06 10:00', 'EventA', 1),
        ('TEST01', '2012/03/06 10:01', 'EventB', 2),
        ('TEST01', '2012/03/06 11:00', 'EventC', 0)
IF EXISTS
    (
        SELECT 
            NULL 
        FROM 
            @DataTable AS DataTable 
        WHERE 
            DataTable.Event=@NewEvent 
            AND DataTable.Name=@NewName
    )
BEGIN
    IF EXISTS
    (
        SELECT 
            NULL 
        FROM 
            @DataTable AS DataTable 
        WHERE 
            DataTable.Event=@NewEvent 
            AND DataTable.Name=@NewName 
            AND DataTable.TimeStamp<@NewTimeStamp
    )
    BEGIN
        UPDATE @DataTable
        SET TimeStamp=@NewTimeStamp,
            Data=@NewData
        WHERE
            Event=@NewEvent 
            AND Name=@NewName 
            AND TimeStamp<@NewTimeStamp
    END
END
ELSE
BEGIN
    INSERT INTO @DataTable(Data,Event,Name,TimeStamp)
    VALUES(@NewData,@NewEvent,@NewName,@NewTimeStamp)
END
如何在SQL中执行以下操作:

If DataTable contains row where Name = @NewName and Event = @NewEvent Then
    If TimeStamp of the above row < @NewTimeStamp
        Update that row with new TimeStamp and Data
    EndIf
Else
    Insert row into table
EndIf

也许是这样的:

DECLARE @DataTable TABLE
(
    Name varchar(10),
    [TimeStamp] DateTime,
    Event varchar(10),
    Data varchar(10)
)

INSERT INTO @DataTable
VALUES  ('TEST01', '2012/03/06 10:00', 'EventA', 1),
        ('TEST01', '2012/03/06 10:01', 'EventB', 2),
        ('TEST01', '2012/03/06 11:00', 'EventC', 0)
IF EXISTS
    (
        SELECT 
            NULL 
        FROM 
            @DataTable AS DataTable 
        WHERE 
            DataTable.Event=@NewEvent 
            AND DataTable.Name=@NewName
    )
BEGIN
    IF EXISTS
    (
        SELECT 
            NULL 
        FROM 
            @DataTable AS DataTable 
        WHERE 
            DataTable.Event=@NewEvent 
            AND DataTable.Name=@NewName 
            AND DataTable.TimeStamp<@NewTimeStamp
    )
    BEGIN
        UPDATE @DataTable
        SET TimeStamp=@NewTimeStamp,
            Data=@NewData
        WHERE
            Event=@NewEvent 
            AND Name=@NewName 
            AND TimeStamp<@NewTimeStamp
    END
END
ELSE
BEGIN
    INSERT INTO @DataTable(Data,Event,Name,TimeStamp)
    VALUES(@NewData,@NewEvent,@NewName,@NewTimeStamp)
END
如果存在
(
挑选
无效的
从…起
@DataTable作为DataTable
哪里
DataTable.Event=@NewEvent
和DataTable.Name=@NewName
)
开始
如果存在
(
挑选
无效的
从…起
@DataTable作为DataTable
哪里
DataTable.Event=@NewEvent
和DataTable.Name=@NewName

和DataTable.TimeStamp可能是这样的:

DECLARE @DataTable TABLE
(
    Name varchar(10),
    [TimeStamp] DateTime,
    Event varchar(10),
    Data varchar(10)
)

INSERT INTO @DataTable
VALUES  ('TEST01', '2012/03/06 10:00', 'EventA', 1),
        ('TEST01', '2012/03/06 10:01', 'EventB', 2),
        ('TEST01', '2012/03/06 11:00', 'EventC', 0)
IF EXISTS
    (
        SELECT 
            NULL 
        FROM 
            @DataTable AS DataTable 
        WHERE 
            DataTable.Event=@NewEvent 
            AND DataTable.Name=@NewName
    )
BEGIN
    IF EXISTS
    (
        SELECT 
            NULL 
        FROM 
            @DataTable AS DataTable 
        WHERE 
            DataTable.Event=@NewEvent 
            AND DataTable.Name=@NewName 
            AND DataTable.TimeStamp<@NewTimeStamp
    )
    BEGIN
        UPDATE @DataTable
        SET TimeStamp=@NewTimeStamp,
            Data=@NewData
        WHERE
            Event=@NewEvent 
            AND Name=@NewName 
            AND TimeStamp<@NewTimeStamp
    END
END
ELSE
BEGIN
    INSERT INTO @DataTable(Data,Event,Name,TimeStamp)
    VALUES(@NewData,@NewEvent,@NewName,@NewTimeStamp)
END
如果存在
(
挑选
无效的
从…起
@DataTable作为DataTable
哪里
DataTable.Event=@NewEvent
和DataTable.Name=@NewName
)
开始
如果存在
(
挑选
无效的
从…起
@DataTable作为DataTable
哪里
DataTable.Event=@NewEvent
和DataTable.Name=@NewName

和DataTable.TimeStamp您可以简单地检查是否存在带有参数的行

IF EXISTS (SELECT * FROM @DataTable WHERE Name = @newName AND Event = @newEvent)
BEGIN
    IF EXISTS (SELECT * FROM @DataTable WHERE Name = @newName AND Event = @newEvent AND     TimeStamp < @newTimeStamp)
        --Update
    UPDATE @DataTable
        SET TimeStamp=@NewTimeStamp,
            Data=@NewData
    WHERE
        Event=@NewEvent 
        AND Name=@NewName 
END
ELSE
BEGIN
--insert
END
如果存在(从@DataTable中选择*,其中Name=@newName和Event=@newEvent)
开始
如果存在(从@DataTable中选择*,其中Name=@newName和Event=@newEvent和TimeStamp<@newTimeStamp)
--更新
更新@DataTable
设置时间戳=@NewTimeStamp,
Data=@NewData
哪里
Event=@NewEvent
和Name=@NewName
结束
其他的
开始
--插入
结束

您只需检查参数中是否存在行

IF EXISTS (SELECT * FROM @DataTable WHERE Name = @newName AND Event = @newEvent)
BEGIN
    IF EXISTS (SELECT * FROM @DataTable WHERE Name = @newName AND Event = @newEvent AND     TimeStamp < @newTimeStamp)
        --Update
    UPDATE @DataTable
        SET TimeStamp=@NewTimeStamp,
            Data=@NewData
    WHERE
        Event=@NewEvent 
        AND Name=@NewName 
END
ELSE
BEGIN
--insert
END
如果存在(从@DataTable中选择*,其中Name=@newName和Event=@newEvent)
开始
如果存在(从@DataTable中选择*,其中Name=@newName和Event=@newEvent和TimeStamp<@newTimeStamp)
--更新
更新@DataTable
设置时间戳=@NewTimeStamp,
Data=@NewData
哪里
Event=@NewEvent
和Name=@NewName
结束
其他的
开始
--插入
结束
merge@DataTable作为dt
使用(选择@data作为数据,@event作为事件,@name作为名称,@timestamp作为时间戳)源
在dt.name=source.name和dt.event=source.event上
当匹配和dt.timestamp source.timestamp时,则
插入(数据、事件、名称、时间戳)
值(数据、事件、名称、时间戳)
当不匹配时
插入(数据、事件、名称、时间戳)
值(数据、事件、名称、时间戳)
merge@DataTable作为dt
使用(选择@data作为数据,@event作为事件,@name作为名称,@timestamp作为时间戳)源
在dt.name=source.name和dt.event=source.event上
当匹配和dt.timestamp source.timestamp时,则
插入(数据、事件、名称、时间戳)
值(数据、事件、名称、时间戳)
当不匹配时
插入(数据、事件、名称、时间戳)
值(数据、事件、名称、时间戳)

但是,如果数据比现有数据旧,那么不会添加新行吗?但是如果数据比现有数据旧,那么不会添加新行吗?太棒了-我想你只需要去掉第二个“匹配时”块。太棒了-我想你只需要去掉第二个“匹配时”块。