Обновление SQL, если существует и старше, в противном случае вставьте - PullRequest
0 голосов
/ 08 марта 2012

У меня есть таблица в 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)

Как мне сделать следующее в 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

Например, у меня есть следующие три точки данных и их ожидаемые действия:

('TEST01', '2012/03/06 10:01', 'EventA', 5), -- This should update the existing row because it's a newer EventA
('TEST01', '2011/01/01 9:00', 'EventB', 2), -- This should be discarded because a newer EventB data point exists in the table
('TEST01', '2011/05/12 17:00', 'EventD', 0), -- This should be inserted because no row in the table contains EventD

Ответы [ 4 ]

4 голосов
/ 08 марта 2012
merge @DataTable as dt
using (select @data as data, @event as event, @name as name, @timestamp as timestamp) source 
on dt.name=source.name and dt.event=source.event
when matched and dt.timestamp <= source.timestamp then
  update
  set timestamp = source.timestamp, data = source.data
when matched and dt.timestamp > source.timestamp then 
  insert(data, event, name, timestamp)
  values(data, event, name, timestamp)
when not matched then
  insert(data, event, name, timestamp)
  values(data, event, name, timestamp)
0 голосов
/ 28 октября 2014
BEGIN TRANSACTION;
UPDATE dbo.table SET ... WHERE PK = @PK;
IF @@ROWCOUNT = 0
BEGIN
  INSERT dbo.table(PK, ...) SELECT @PK, ...;
END
COMMIT TRANSACTION;
0 голосов
/ 08 марта 2012

Вы можете просто проверить, существуют ли строки с вашими параметрами

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
0 голосов
/ 08 марта 2012

Может быть, что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...