Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 INSERT и UPDATE в одной хранимке  [new]
maquisard
Member

Откуда:
Сообщений: 18
Здравствуйте
такая проблема:

Есть задача накапливать информацию целый день и в конце дня вставить в таблицу. Но, нужно вставить строку, если в таблице нет записи с конкретным ID, а если есть то надо сделать UPDATE этой строки.
Сейчас реализовано так: в течение дня данные вставляются во временную таблицу. В конце дня на стороне клинта органицован цикл по записям временной таблицы, хранимке передается строка и если запись с таим ID уже существует делается UPDATE, если же нет, то - INSERT.

Возможно ли как-то по другому (более эффективно) решить эту задачу? только без использования курсора.

Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 
1988-2005 Microsoft Corporation  Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
14 июл 09, 14:21    [7413528]     Ответить | Цитировать Сообщить модератору
 Re: INSERT и UPDATE в одной хранимке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Сначала
UPDATE ... FROM ... JOIN [Временная таблица] ON ...
А потом
INSERT ... SELECT ... FROM [Временная таблица] WHERE NOT EXISTS(SELECT * FROM ... WHERE ...)
В последнем запросе желательна блокировка таблицы,
если есть возможность вставки из другого коннекта.
Обсуждалось неоднократно, в том числе совсем недавно.
14 июл 09, 14:26    [7413561]     Ответить | Цитировать Сообщить модератору
 Re: INSERT и UPDATE в одной хранимке  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33358
Блог
create table #хранилище(a int primary key, b varchar(100))

insert into #хранилище
select 1,'x1' union all
select 2,null union all
select 3,'v'


create table #измененные(a int primary key, b varchar(100))

insert into #измененные
select 2,'измененная запись' union all
select 5,'новая запись'


select * from #хранилище
select * from #измененные

   MERGE #хранилище AS target
    USING (SELECT a, b from #измененные) AS source (a, b)
    ON (target.a = source.a)
    WHEN MATCHED THEN 
        UPDATE SET b = source.b
	WHEN NOT MATCHED THEN	
	    INSERT (a, b)
	    VALUES (source.a, source.b)
	    OUTPUT deleted.*, $action, inserted.* ;
	    
select * from #хранилище
select * from #измененные
вот так еще можно, правда про производительность этого решения ничего не скажу
14 июл 09, 14:56    [7413782]     Ответить | Цитировать Сообщить модератору
 Re: INSERT и UPDATE в одной хранимке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Критик
create table #хранилище(a int primary key, b varchar(100))

insert into #хранилище
select 1,'x1' union all
select 2,null union all
select 3,'v'


create table #измененные(a int primary key, b varchar(100))

insert into #измененные
select 2,'измененная запись' union all
select 5,'новая запись'


select * from #хранилище
select * from #измененные

   MERGE #хранилище AS target
    USING (SELECT a, b from #измененные) AS source (a, b)
    ON (target.a = source.a)
    WHEN MATCHED THEN 
        UPDATE SET b = source.b
	WHEN NOT MATCHED THEN	
	    INSERT (a, b)
	    VALUES (source.a, source.b)
	    OUTPUT deleted.*, $action, inserted.* ;
	    
select * from #хранилище
select * from #измененные
вот так еще можно, правда про производительность этого решения ничего не скажу
Так ведь сказано же, SQL2005
14 июл 09, 15:01    [7413828]     Ответить | Цитировать Сообщить модератору
 Re: INSERT и UPDATE в одной хранимке  [new]
maquisard
Member

Откуда:
Сообщений: 18
iap,

огромное спасибо, все отлично работает
14 июл 09, 15:20    [7413973]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить