Имя: Пароль:
1C
 
Кто силен в SQL? Команда MERGE интересует.
0 bizon2008
 
12.05.15
08:07
Кто силен в SQL? Команда MERGE интересует.
В общем, как туда запихать условие, типа если поля записи устарели то их обновить(UPDATE), иначе ничего не делать.
1 ЧеловекДуши
 
12.05.15
08:25
(0) Вроде точно так же.
2 ЧеловекДуши
 
12.05.15
08:27
3 bizon2008
 
12.05.15
08:36
(2) Я эту простыну уже третий час читаю. Скажи проще, плиз. Типа есть в записи поля контрагент, товар и сумма. Как условие прикрути что если что поменялось то апгредит иначе не надо.
4 ЧеловекДуши
 
12.05.15
08:53
(3) Что значит, что либо. Это все го лишь запрос. Все что по отбору попадет, то и поменяется. Или я так же, как и ты использую только поверхности этого "айсберга" :)

Часть примера из ссылки в (2).

Должно быть указано по крайней мере одно из трех предложений MATCHED, но они могут быть указаны в любом порядке. В одном предложении MATCHED переменная не может быть обновлена больше одного раза.

    SET NOCOUNT ON;

    MERGE Production.UnitMeasure AS target
    USING (SELECT @UnitMeasureCode, Name) AS source (UnitMeasureCode, Name)
    ON (target.UnitMeasureCode = source.UnitMeasureCode)
    WHEN MATCHED THEN
        UPDATE SET Name = source.Name
WHEN NOT MATCHED THEN
    INSERT (UnitMeasureCode, Name)
    VALUES (source.UnitMeasureCode, source.Name)
    OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
END;
5 bizon2008
 
12.05.15
09:11
(4) Это неинтересно, тут тупо сравнение по ключевым полям двух таблиц.
6 ЧеловекДуши
 
12.05.15
09:21
(5) Тогда может выполнять команду "UPDATE" и не мучаться?

А так то там все в команде MATCHED
Пиши, так как тебе надо. Не думаю ,что если ты не укажешь "WHEN NOT MATCHED THEN", то MERGE от этот перестанет работать ;)

Замечания

Должно быть указано по крайней мере одно из трех предложений MATCHED, но они могут быть указаны в любом порядке. В одном предложении MATCHED переменная не может быть обновлена больше одного раза.

На все операции удаления, вставки или обновления, указанные применительно к целевой таблице инструкции MERGE, распространяются все ограничения, определенные для этой таблицы, включая все каскадные ограничения ссылочной целостности. Если IGNORE_DUP_KEY имеет значение ON для всех уникальных индексов в целевой таблице, то в инструкции MERGE этот параметр не учитывается.

Чтобы использовать инструкцию MERGE, необходима точка с запятой (;) как признак конца инструкции. Возникает ошибка 10713, если инструкция MERGE выполняется без признака конца конструкции.


..............
WHEN MATCHED THEN <merge_matched>

    Указывается, что все строки target_table, которые соответствуют строкам, возвращенным <table_source> ON <merge_search_condition>, и удовлетворяют дополнительным условиям поиска, обновляются или удаляются в соответствии с предложением <merge_matched>.

    Инструкция MERGE может иметь не больше двух предложений WHEN MATCHED. Если указаны два предложения, первое предложение должно сопровождаться предложением AND <search_condition>. Для любой строки второе предложение WHEN MATCHED применяется только в тех случаях, если не применяется первое. Если имеются два предложения WHEN MATCHED, одно должно указывать действие UPDATE, а другое — действие DELETE. Если действие UPDATE указано в предложении <merge_matched> и более одной строки в <table_source>соответствует строке в target_table на основе <merge_search_condition>, то SQL Server возвращает ошибку. Инструкцию MERGE нельзя использовать для обновления одной строки более одного раза, а также использовать для обновления и удаления одной и той же строки.
WHEN NOT MATCHED [ BY TARGET ] THEN <merge_not_matched>

    Указывает, что строка вставлена в таблицу target_table для каждой строки, возвращенной выражением <table_source> ON <merge_search_condition>, которая не соответствует строке в таблице target_table, но удовлетворяет дополнительному условию поиска (при наличии такового). Значения для вставки указываются с помощью предложения <merge_not_matched>. Инструкция MERGE может иметь только одно предложение WHEN NOT MATCHED.
WHEN NOT MATCHED BY SOURCE THEN <merge_matched>

    Указывается, что все строки target_table, которые не соответствуют строкам, возвращенным <table_source> ON <merge_search_condition>, и удовлетворяют дополнительным условиям поиска, обновляются или удаляются в соответствии с предложением <merge_matched>.

    Инструкция MERGE может иметь не более двух предложений WHEN NOT MATCHED BY SOURCE. Если указаны два предложения, то первое предложение должно сопровождаться предложением AND <clause_search_condition>. Для любой выбранной строки второе предложение WHEN NOT MATCHED BY SOURCE применяется только в тех случаях, если не применяется первое. Если имеется два предложения WHEN NOT MATCHED BY SOURCE, то одно должно указывать действие UPDATE, а другое — действие DELETE. В условии <clause_search_condition> можно ссылаться только на столбцы целевой таблицы.

    Если строки не возвращаются таблицей <table_source>, к столбцам в исходной таблице не может быть предоставлен доступ. Если операция обновления или удаления, указанная в <merge_matched>, ссылается на столбцы исходной таблицы, то возвращается ошибка 207 (недопустимое имя столбца). Например, предложение WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 может стать причиной ошибки инструкции из-за недоступности столбца Col1 в исходной таблице.
7 spock
 
12.05.15
09:27
(3) "...если что поменялось то апгредит иначе не надо..." - достаточно только UPDATE, согласен с (6).
8 mistеr
 
12.05.15
09:31
(0) Соединить исходную и целевую таблицы, отфильтровать нужным образом, и все это уже ставить в USING.
9 bizon2008
 
12.05.15
09:36
(6) Не, там флаг надо еще поднять что типа эти записи изменились. Тупо все обновить не прокатит.
10 bizon2008
 
12.05.15
09:37
(8) А вот тута поподробнее пожалуйста.
11 mistеr
 
12.05.15
09:51
(10)

MERGE TargetTable AS target
USING (

  SELECT ...
    FROM SourceTable
    LEFT LOIN TargetTable ...
   WHERE <что-то изменилось>

) AS source
...
12 Serginio1
 
12.05.15
10:25
|MERGE into dbo."+СтрРегПрайсов.ИмяТаблицыХранения+" as ИзменяемыеПрайсы
     |Using #TempPrice as Источник";
     Стр=Стр+"
     |   ON Источник.Артикул=ИзменяемыеПрайсы."+РегПрайсовПоля.Артикул+"
     |   and @Прайс=ИзменяемыеПрайсы."+РегПрайсовПоля.ТипЦен+"
     |   and Источник.Мейк = ИзменяемыеПрайсы."+РегПрайсовПоля.Мейк+"
     |   When MATCHED AND (@Импорт<>ИзменяемыеПрайсы."+РегПрайсовПоля.Импорт+СтрРавнения+") Then
     |   Update Set ИзменяемыеПрайсы."+РегПрайсовПоля.Импорт+"=@Импорт"+СтрУстановки+"
     | When NOT MATCHED THEN
     |INSERT(";
13 Serginio1
 
12.05.15
10:30
То есть
When MATCHED AND сравнение полей на изменение
14 bizon2008
 
12.05.15
10:48
(12) #TempPrice - это у тебя чего?
15 Serginio1
 
12.05.15
10:58
(14) Таблица с которой сравнивают.
https://msdn.microsoft.com/ru-ru/library/bb510625.aspx

USING <table_source>
Указывается источник данных, который сопоставляется со строками данных в таблице target_table на основе условия <merge_search condition>.  Результат этого совпадения обуславливает действия, которые выполняются предложениями WHEN инструкции MERGE. Аргумент <table_source> может быть удаленной таблицей или производной таблицей, которая обращается к удаленным таблицам.

Аргументом <table_source> может быть производная таблица, использующая конструктор табличных значений Transact-SQL для построения таблицы путем указания нескольких строк.  

Дополнительные сведения о синтаксисе и аргументах этого предложения см. в разделе Предложение FROM (Transact-SQL).
16 Serginio1
 
12.05.15
11:05
У меня загрузка в регистры сведений из CSV
Я сначала через OPENROWSET загружаю данные во временную таблицу

|INTO #TempPrice
     |FROM OPENROWSET( BULK N'"+ФайлСПрайсом+"',
     |FORMATFILE = N'"+ИмяФайлаФрмата+"',";

Затем создаю индекс

Стр=Стр+"
     |Create INDEX TempPriceInd ON #TempPrice(Артикул,Прайс,Мейк);


Сравниваю и записываю
v8: _SimpleKey и его установка
17 bizon2008
 
12.05.15
11:33
Понятно. Ушел пробовать.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.