|
Кто силен в 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
|
Понятно. Ушел пробовать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |