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

Откуда:
Сообщений: 1732
Доброго всем!
Тут нарвался с merge на непонятку. Есть две таблицы Events и Returns, в обеих есть поле id, при том Returns_ID привязано к Events_ID.
WITH CHECK ADD  CONSTRAINT [FK_Returns_Events] FOREIGN KEY([id])
REFERENCES [dbo].[Events] ([id])


Делаю Megre
Merge Returns as t
using  Events as s
(on t.id=s.id and s.id =@id)
when not matched by target
then insert(id, dt) values (s.id, s.dt)
бла-бла-бла

и вот когда не находит такую запись в Returns то выдает ошибку, что в таблицу Returns нельзя вставить повторяющиеся значение ключа. Хотя точно вижу, что в таблице Returns такого ключа нет.
Через
if not exists (select 0 from Returns where id=@id)
insert into Returns (id, dt)
select id, dt from Events where id=@id

все нормально отрабатывает, а через Merge ругается. Понимаю, что серверу не нравится внешняя связь по ID, но не очень понимаю, почему он на нее ругается, в мануалах ничего не нашел, не подскажите где почитать про этот момент можно?
29 май 16, 17:24    [19232826]     Ответить | Цитировать Сообщить модератору
 Re: Merge не подскажете что не так  [new]
iap
Member

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

показать нам FOREIGN KEY недостаточно.
Почему бы не написать скрипт создания таблиц с уникальными индексами и констрейнтами?
Пока можно предположить, что в Returns.id вставляется NULL, а один NULL там уже есть.
29 май 16, 17:34    [19232847]     Ответить | Цитировать Сообщить модератору
 Re: Merge не подскажете что не так  [new]
iap
Member

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

может быть, вставлять не s.id, а @id.
29 май 16, 17:37    [19232854]     Ответить | Цитировать Сообщить модератору
 Re: Merge не подскажете что не так  [new]
ALOTE
Member

Откуда:
Сообщений: 1732
iap,
Вот скрипт самой таблицы
CREATE TABLE [dbo].[Returns](
	[id] [int] NOT NULL,
	[dt] [datetime] NOT NULL
 CONSTRAINT [PK_Returns] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Returns]  WITH CHECK ADD  CONSTRAINT [FK_Returns_Events] FOREIGN KEY([id])
REFERENCES [dbo].[Events] ([id])
GO

ALTER TABLE [dbo].[Returns] CHECK CONSTRAINT [FK_Returns_Events]
29 май 16, 18:31    [19232957]     Ответить | Цитировать Сообщить модератору
 Re: Merge не подскажете что не так  [new]
ALOTE
Member

Откуда:
Сообщений: 1732
iap,@id пытался вставить, тоже самое, даже пытался вбить цифру 844(это id присутствующие в Events, но отсутствующие в returns), опять ругался
29 май 16, 18:32    [19232961]     Ответить | Цитировать Сообщить модератору
 Re: Merge не подскажете что не так  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
ALOTE
iap,@id пытался вставить, тоже самое, даже пытался вбить цифру 844(это id присутствующие в Events, но отсутствующие в returns), опять ругался
Во-первых, 844 - не цифра
Во-вторых, почему не скопипастить сюда оригинальное сообщение?
В-третьих, есть ли у таблицы триггеры?
29 май 16, 19:05    [19233038]     Ответить | Цитировать Сообщить модератору
 Re: Merge не подскажете что не так  [new]
ALOTE
Member

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

От того, что она число дело не менялось. Триггеров не было. Но в чем мой баг нашел:
Переписал так
Merge Returns as t
using (select id, dt from Events where id = @id) as s 
( t.id=s.id and s.id =@id)

и отработало.
Просто сервер пытался вставить первое значение из Events, а оно, к счастью, уже в Returns было, а то бы замучался потом данные вычищать.
29 май 16, 20:50    [19233257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить