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

Откуда:
Сообщений: 16
Господа форумчане, ОЧЕНЬ СРОЧНО нужна Ваша помощь! есть две таблицы с идентичной структурой (ID, ФИО, год обучения)... Нужно вродь как синхронизировать данные между ними...
решил сначала таким образом
merge InventoryStudents 
using CurrentInventoryStudents on InventoryStudents.StudentsName= CurrentInventoryStudents.StudentsName
when matched
    then update set StudyYear= CurrentInventoryStudents.StudyYear
when not matched by target
    then insert (StudentsName,StudyYear) values (CurrentInventoryStudents.StudentsName, CurrentInventoryStudents.StudyYear)
when not matched by source
    then delete
output $action AS 'ACTION',Inserted.*, Deleted.*;


но проблема в том, что такая контрукция выводит излишние данные, т.е. кроме ФИО и года еще и АйДи (но это еще ладно - перечислю столбцы)...
А вот как сделать, чтобы шапка таблицы вывода (т.е. выводящейся нам на экран) состояла всего из трех столбцов. А нынешнем положении она выводит по два стобца первой таблицы и два - второй, соответственно кое-где проскакивают НАЛЛы... Надеюсь правильно и понятно сформулировал просьбу...

Дабы еще чуток конкретизировать вопрос, привожу пример по этой теме с МСДН:
MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID AND T.EmployeeName LIKE 'S%' 
    AND S.EmployeeName LIKE 'S%' )
WHEN NOT MATCHED BY TARGET
    THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED 
    THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE
    THEN DELETE
OUTPUT $action, Inserted.*, Deleted.*;


На такую конструкцию сервер отвечает таким ответом:
$action EmployeeID EmployeeName EmployeeID EmployeeName

--------- ----------- ------------ ----------- ------------

DELETE NULL NULL 100 Mary

DELETE NULL NULL 101 Sara

DELETE NULL NULL 102 Stefano

INSERT 103 Bob NULL NULL

INSERT 104 Steve NULL NULL

(Обработано строк: 5)
А как сделать, чтоб выводилось все без дублирующихся названий столбцов че-то не указано... Т.е. как сделать в этом примере, чтобы вывело

$action EmployeeID EmployeeName
--------- ----------- ------------
DELETE 100 Mary
DELETE 101 Sara
DELETE 102 Stefano
INSERT 103 Bob
INSERT 104 Steve

(Обработано строк: 5)

ОЧЕНЬ НАДЕЮСЬ НА ВАШУ ПОМОЩЬ!!!
25 фев 13, 19:05    [13978981]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а если вместо звездочек писать имена столбцов?
25 фев 13, 19:10    [13979005]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
Сделать output во временную таблицу выбрать из нее нужные поля.
25 фев 13, 19:11    [13979012]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
Хотя да, начните с явного перечисления нужных вам полей в output.
25 фев 13, 19:12    [13979017]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
mifi83
Member

Откуда:
Сообщений: 16
Гавриленко Сергей Алексеевич,

Извините, забыл уточнить условие... Нужно это сделать ТОЛЬКО ОДНИМ выражением, т.е. насколько я понял, вариант с "сначала MERGE во временную таблицу а потом из нее Select" к сожалению не катит...
25 фев 13, 19:16    [13979037]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
mifi83
Member

Откуда:
Сообщений: 16
Паганель,

если вместо звездочек прописываю имена, то вместо действий над таблицей-источником выводяться НАЛы... :(
25 фев 13, 19:24    [13979076]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
mifi83
если вместо звездочек прописываю имена, то вместо действий над таблицей-источником выводяться НАЛы... :(
Сказки вы какие-то рассказываете.
declare @InventoryStudents table (StudentsName varchar(100), StudyYear int);
declare @CurrentInventoryStudents table (StudentsName varchar(100), StudyYear int);

insert into @InventoryStudents
values
 ('Студент1', 2012), ('Студент2', 2013);
  
insert into @CurrentInventoryStudents
values
 ('Студент1', 2013), ('Студент4', 2013);

merge @InventoryStudents t
using @CurrentInventoryStudents s on t.StudentsName= s.StudentsName
when matched
    then update set StudyYear = s.StudyYear
when not matched by target
    then insert (StudentsName, StudyYear) values (s.StudentsName, s.StudyYear)
when not matched by source
    then delete
output $action as [action], isnull(Inserted.StudentsName, Deleted.StudentsName) as StudentsName, isnull(Inserted.StudyYear, Deleted.StudyYear) as StudyYear;
25 фев 13, 19:34    [13979157]     Ответить | Цитировать Сообщить модератору
 Re: Инструкция MERGE!  [new]
mifi83
Member

Откуда:
Сообщений: 16
invm, воо-о-о... Спасибо большое: с isnull(...) процес пошел!!!
Еще раз всем спасибо!!!
25 фев 13, 19:51    [13979257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить