Кто силен в SQL? Команда MERGE интересует. #742403


#0 by bizon2008
Кто силен в SQL? Команда MERGE интересует. В общем, как туда запихать условие, типа если поля записи устарели то их обновить(UPDATE), иначе ничего не делать.
#1 by ЧеловекДуши
Вроде точно так же.
#2 by ЧеловекДуши
#3 by bizon2008
Я эту простыну уже третий час читаю. Скажи проще, плиз. Типа есть в записи поля контрагент, товар и сумма. Как условие прикрути что если что поменялось то апгредит иначе не надо.
#4 by ЧеловекДуши
Что значит, что либо. Это все го лишь запрос. Все что по отбору попадет, то и поменяется. Или я так же, как и ты использую только поверхности этого "айсберга" :) Часть примера из ссылки в . Должно быть указано по крайней мере одно из трех предложений MATCHED, но они могут быть указаны в любом порядке. В одном предложении MATCHED переменная не может быть обновлена больше одного раза.     SET NOCOUNT ON;     MERGE Production.UnitMeasure AS target     USING (SELECT @UnitMeasureCode, ) AS source (UnitMeasureCode, Name)     ON (target.UnitMeasureCode = source.UnitMeasureCode)     WHEN MATCHED THEN         UPDATE SET Name = source.Name WHEN NOT MATCHED THEN
#5 by bizon2008
Это неинтересно, тут тупо сравнение по ключевым полям двух таблиц.
#6 by ЧеловекДуши
Тогда может выполнять команду "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 by spock
"...если что поменялось то апгредит иначе не надо..." - достаточно только UPDATE, согласен с .
#8 by mistеr
Соединить исходную и целевую таблицы, отфильтровать нужным образом, и все это уже ставить в USING.
#9 by bizon2008
Не, там флаг надо еще поднять что типа эти записи изменились. Тупо все обновить не прокатит.
#10 by bizon2008
А вот тута поподробнее пожалуйста.
#11 by mistеr
MERGE TargetTable AS target     FROM SourceTable     LEFT LOIN TargetTable ... ...
#12 by Serginio1
#13 by Serginio1
То есть When MATCHED AND сравнение полей на изменение
#14 by bizon2008
#TempPrice - это у тебя чего?
#15 by Serginio1
Таблица с которой сравнивают. USING <table_source> Указывается источник данных, который сопоставляется со строками данных в таблице target_table на основе условия <merge_search condition>.  Результат этого совпадения обуславливает действия, которые выполняются предложениями WHEN инструкции MERGE. Аргумент <table_source> может быть удаленной таблицей или производной таблицей, которая обращается к удаленным таблицам. Аргументом <table_source> может быть производная таблица, использующая конструктор табличных значений Transact-SQL для построения таблицы путем указания нескольких строк.   Дополнительные сведения о синтаксисе и аргументах этого предложения см. в разделе Предложение FROM (Transact-SQL).
#16 by Serginio1
У меня загрузка в регистры сведений из CSV Я сначала через OPENROWSET загружаю данные во временную таблицу |INTO #TempPrice      |FROM OPENROWSET( BULK N'"+ФайлСПрайсом+"', Затем создаю индекс Сравниваю и записываю
#17 by bizon2008
Понятно. Ушел пробовать.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С