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

Откуда:
Сообщений: 202
Приветствую знатоки !

Есть задача : внести информацию в табличку..
все просто, если есть запись, то update, нет - insert

у меня кое-как получилось :
use mts_operational GO

create table test
(
 id int ,
 val char(1) 
)
  --delete from dbo.test
insert into test values (1, 'a');
insert into test values (2, 'b');
insert into test values (3, 'c');
insert into test values (4, 'd');
insert into test values (5, 'e');

create table #t 
(
 id int ,
 val char(1) 
)

insert into #t values (1, '1');
insert into #t values (3, 'u');
insert into #t values (6, 'i');
insert into #t values (7, '7');


if exists (select * from #t where #t.id in (select id from dbo.test))

update dbo.test set dbo.test.val = #t.val
from dbo.test
     join #t on dbo.test.id = #t.id
GO
if exists (select * from #t where #t.id not in (select id from dbo.test))
insert into dbo.test
       select #t.id, #t.val from #t where #t.id not in (select id from dbo.test)
GO

select * from test


drop table #t; drop table test


/*select * from test
select * from #t*/

и так вопрос : существует не такое громоздкое решение ?
23 май 11, 16:08    [10695298]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
Glory
Member

Откуда:
Сообщений: 104751
SQL2008 - MERGE
23 май 11, 16:09    [10695317]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

Откуда:
Сообщений: 202
забыл сорри
select @@version

"Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 
	May 26 2009 14:13:01 
	Copyright (c) 1988-2005 Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)"
23 май 11, 16:22    [10695412]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
Glory
Member

Откуда:
Сообщений: 104751
- Тогда зачем 2 раза одинаковый if exists ( ?
- возможно придется блокировать придется таблицу между проверкой и update/insert от аналогичных действий в параллельных коннектах
23 май 11, 16:25    [10695444]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

Откуда:
Сообщений: 202
если свести до одного if exists,

if exists (select * from #t where #t.id in (select id from dbo.test))
begin
update dbo.test set dbo.test.val = #t.val
from dbo.test
     join #t on dbo.test.id = #t.id
end
else
begin
/*if exists (select * from #t where #t.id not in (select id from dbo.test))*/
insert into dbo.test
       select #t.id, #t.val from #t where #t.id not in (select id from dbo.test)
end

ТО данные только аптейтятся..
23 май 11, 16:38    [10695556]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
yado4eg,

1. апдейтим из джойна. Фактически, проверка существования и апдейт происходят одновременно.
2. добавляем записи с проверкой на NOT EXISTS() в целевой таблице.

IFы лишние. IMHO

INSERT после UPDATE, потому что зачем апдейтить записи,
которые в этот момент только появляются и сразу соответствуют источнику.
23 май 11, 16:45    [10695635]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

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

update dbo.test
set dbo.test.val = #t.val
from dbo.test
     join #t on dbo.test.id = #t.id
go
insert into dbo.test
       select #t.id, #t.val from #t where /*#t.id*/ not exists (select * from dbo.test)
go

select * from dbo.test

все равно только апдейт :(
23 май 11, 17:10    [10695861]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

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

pa-pa-pa-pokerface..


update dbo.test
set dbo.test.val = #t.val
from dbo.test
     join #t on dbo.test.id = #t.id
go
insert into dbo.test
       select #t.id, #t.val from #t where
              not exists (select * from dbo.test t
                         where t.id = #t.id
                         )


зы thx2ALL
23 май 11, 17:13    [10695885]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

Откуда:
Сообщений: 202
ppl! ,

на реальных таблицах не хочет :((

табличка с данными :
CREATE TABLE [dbo].[OutletDistrs] (
  [olID]bigint NOT NULL,
  [dist_id]int NOT NULL,
  [dlm]smalldatetime CONSTRAINT [DF_oldist_dlm] DEFAULT getdate() NOT NULL,
  CONSTRAINT [pk_olID] PRIMARY KEY CLUSTERED ([olID]),
  CONSTRAINT [fk_distr_OLdistr] FOREIGN KEY ([dist_id]) 
  REFERENCES [dbo].[distributors] ([dist_id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)
ON [PRIMARY]
GO

апдейт проходит отлично, а здеся
insert into dbo.test
       select #t.id, #t.val from #t where
              not exists (select * from dbo.test t
                         where t.id = #t.id
                         )
Violation of PRIMARY KEY constraint 'pk_olID'. Cannot insert duplicate key in object 'dbo.OutletDistrs'.

смысл сообщения мне понятен. ток вот почему ?

any ideas ?
23 май 11, 18:53    [10696493]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
yado4eg
any ideas ?
Какие идеи? CREATE TABLE [dbo].[OutletDistrs] с PRIMARY KEY(pk_olID) с одной стороны,
и какие-то dbo.test и #t - с другой (в запросе).
По-Вашему, это логично заданный вопрос?
23 май 11, 20:30    [10696782]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

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

тестовую таблицу проверил естесна с такой строкой :
create table test
(
 id int not null ,
 val char(1),
 [b]CONSTRAINT [pk_id] PRIMARY KEY CLUSTERED ([id])[/b]
)
  --delete from dbo.test
insert into test values (1, 'a');
insert into test values (2, 'b');
insert into test values (3, 'c');
insert into test values (4, 'd');
insert into test values (5, 'e');


все работает.

на реальный данных - нет.
23 май 11, 20:51    [10696820]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

Откуда:
Сообщений: 202
даже если заполнить временную таблицу только новыми данными,
которых точно нет в целевой таблице,
все равно Violation of PRIMARY KEY

может прибить DLM поле в целевой табличке ?
автор
[dlm]smalldatetime CONSTRAINT [DF_oldist_dlm] DEFAULT getdate() NOT NULL,


people help needed !
24 май 11, 11:35    [10698862]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
Glory
Member

Откуда:
Сообщений: 104751
yado4eg
даже если заполнить временную таблицу только новыми данными,
которых точно нет в целевой таблице,
все равно Violation of PRIMARY KEY

может прибить DLM поле в целевой табличке ?
автор
[dlm]smalldatetime CONSTRAINT [DF_oldist_dlm] DEFAULT getdate() NOT NULL,


people help needed !

Ну так проверяйте, какие вы добавляете
24 май 11, 11:38    [10698892]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

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

автор
select #t.id, #t.val from #t where
not exists (select * from dbo.test t
where t.id = #t.id
)


я думаю это гарантирует проверку того что этих данных нет в нужной таблице.
24 май 11, 11:52    [10699030]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
Glory
Member

Откуда:
Сообщений: 104751
yado4eg
Glory,

автор
select #t.id, #t.val from #t where
not exists (select * from dbo.test t
where t.id = #t.id
)


я думаю это гарантирует проверку того что этих данных нет в нужной таблице.

Если бы это был так, то не было бы нарушения primary key
24 май 11, 11:56    [10699070]     Ответить | Цитировать Сообщить модератору
 Re: update and/or insert  [new]
yado4eg
Member

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

с кодом как оказалось все ок.

проблема с грёбаными манагерами которые предоставляют данные..
24 май 11, 13:05    [10699567]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить