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

Откуда:
Сообщений: 257
Добрый день.

Есть запрос, который запускается в процедуре



MERGE dbo.Client AS TARGET
USING (
SELECT ClientId,TypeId,SystemId,IsActive,IsEdit
FROM dbo.Client
) AS SOURCE ON (TARGET.Id = SOURCE.Id
AND TARGET.TypeId = SOURCE.TypeId
AND TARGET.ClientId = @ClientId)
WHEN NOT MATCHED BY TARGET
THEN INSERT(ClientId,TypeId,SystemId,IsActive,IsEdit) VALUES(@ClientId,@TypeId,@SystemId,@IsActive,@IsEdit);

Ни одной записи в таблице Client нет, по идее должно выполниться условие WHEN NOT MATCHED BY TARGET, после чего должен быть insert, но ничего не происходит, подскажите, пожалуйста, что делаю неверно.

Зарнее благодарен за Ваши ответы
24 июн 15, 11:51    [17810505]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Gviber
Member

Откуда:
Сообщений: 124
написано правильно

попробуйте в конце дописать:
OUTPUT $action, inserted.*

Есть результат?
24 июн 15, 12:01    [17810551]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Gviber
Member

Откуда:
Сообщений: 124
Так две одинаковые таблицы сверяются. Различия только в @ClientId.

Может запись все же есть?
24 июн 15, 12:03    [17810568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user87
Member

Откуда:
Сообщений: 257
нет результата нет, в данной таблице пока ни одной записи.
24 июн 15, 12:03    [17810570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user87
Member

Откуда:
Сообщений: 257
Именно я хотел, что если записи нет, то insert Остальные операции я допишу, проблема именно с insert
24 июн 15, 12:04    [17810576]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Gviber
Member

Откуда:
Сообщений: 124
У вас в таблице источника записей нет, потому сверять не с чем.
24 июн 15, 12:05    [17810580]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user87
Member

Откуда:
Сообщений: 257
А нельзя проверку сделать так в конструкции MERGE, что если записей нет, то делать insert
24 июн 15, 12:07    [17810599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Gviber
Member

Откуда:
Сообщений: 124
MERGE применяется для слияния таблиц. А вы туда пытаетесь вставить левые данные.


Эта задача решается без MERGE. Либо нужно переписывать SOURCE.

WHEN NOT MATCHED BY TARGET
ознаает, что в TARGET записей нет, но в SOURCE есть.
24 июн 15, 12:09    [17810610]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Gviber
У вас в таблице источника записей нет, потому сверять не с чем.
+100500
MERGE dbo.Client AS TARGET
 USING (VALUES(@ClientId,@TypeId,@SystemId,@IsActive,@IsEdit)SOURCE(ClientId,TypeId,SystemId,IsActive,IsEdit)
 ON TARGET.Id = SOURCE.Id
 AND TARGET.TypeId = SOURCE.TypeId
 AND TARGET.ClientId = SOURCE.ClientId
WHEN NOT MATCHED
THEN INSERT(ClientId,TypeId,SystemId,IsActive,IsEdit)
VALUES(SOURCE.ClientId,SOURCE.TypeId,SOURCE.SystemId,SOURCE.IsActive,SOURCE.IsEdit);
24 июн 15, 12:16    [17810638]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Gviber
У вас в таблице источника записей нет, потому сверять не с чем.
+100500
MERGE dbo.Client AS TARGET
 USING (VALUES(@ClientId,@TypeId,@SystemId,@IsActive,@IsEdit)SOURCE(ClientId,TypeId,SystemId,IsActive,IsEdit)
 ON TARGET.Id = SOURCE.Id
 AND TARGET.TypeId = SOURCE.TypeId
 AND TARGET.ClientId = SOURCE.ClientId
WHEN NOT MATCHED
THEN INSERT(ClientId,TypeId,SystemId,IsActive,IsEdit)
VALUES(SOURCE.ClientId,SOURCE.TypeId,SOURCE.SystemId,SOURCE.IsActive,SOURCE.IsEdit);
Ошибся слегка:
MERGE dbo.Client AS TARGET
 USING (VALUES(@ClientId,@TypeId,@SystemId,@IsActive,@IsEdit))SOURCE(ClientId,TypeId,SystemId,IsActive,IsEdit)
 ON TARGET.Id = SOURCE.Id
 AND TARGET.TypeId = SOURCE.TypeId
 AND TARGET.ClientId = SOURCE.ClientId
WHEN NOT MATCHED
THEN INSERT(ClientId,TypeId,SystemId,IsActive,IsEdit)
VALUES(SOURCE.ClientId,SOURCE.TypeId,SOURCE.SystemId,SOURCE.IsActive,SOURCE.IsEdit);
24 июн 15, 12:17    [17810644]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

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

Чего-то в SOURCE Id не написал... :((

Сами докрутить можете? Подозреваю, Id там вообще не нужно.
24 июн 15, 12:19    [17810658]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user87
Member

Откуда:
Сообщений: 257
Огромное спасибо Всем.

Просто супер!
24 июн 15, 12:25    [17810689]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить