Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Доброго дня. Использую Microsoft SQL Server 2008 R2.
Структура полей таблицы.
Id int Unchecked
kontr_id int Unchecked
tovar_id int Unchecked
ser_id int Unchecked
kolvo real Checked
summa real Checked
s_fg smallint Checked
Набор данных у меня берется из 1С, работаю объектами ADODB. Мне нужно проверить запись на различие с моими данными в 1С, их я могу представить в любом виде, если надо то обновить.
Так вот, как организовать проверку, лучше наверно в хранимой процедуре, полей kontr_id ,tovar_id, ser_id, kolvo ,summa, и если они изменились то перезаписать и в s_fg записать единицу, иначе ничего не делать. Тупо перебирать по одной записи и сравнивать по полям ничего пока не придумал. Заранее спасибо.
9 май 15, 14:19    [17621822]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Добрый Э - Эх
Guest
sql123,

почитай про DML-оператор MERGE, может станет острее...
9 май 15, 14:31    [17621837]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Если я правильно понимаю работу инструкции MERGE - это INSERT и UPDATE по принципу или-или. Мне не надо вставлять записи. Мне надо только из обновить, и только в том случае если они типа устарели.
9 май 15, 18:41    [17622146]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
SERG1257
Member

Откуда:
Сообщений: 2752
Вставить во временную таблицу (bulk insert) написать
update data=t.data from yourtable y join #temptable t on y.id=t.id and y.data<>t.data
9 май 15, 19:01    [17622167]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Добрый Э - Эх
Guest
sql123,

ты неправильно понимаешь... кляузы WHEN MATCHED / WHEN NOT MATCHED могут использоваться как вместе, так и каждая по отдельности. Соответственно, можно реализовать отдельно UPDATE, отдельно INSERT, их комбинацию и даже прикрутить удаление записей.
9 май 15, 19:34    [17622214]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Подскажи, коли не в тягость, как в MERGE проверку сделать сравнение полей, которые уже есть в таблице и которые я на сервер БД гружу?
12 май 15, 09:44    [17627251]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20614
sql123
перезаписать и в s_fg записать единицу

UPDATE
sql123
организовать проверку ... полей kontr_id ,tovar_id, ser_id, kolvo ,summa, и если они изменились ... иначе ничего не делать

WHERE
12 май 15, 09:52    [17627279]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Glory
Member

Откуда:
Сообщений: 104760
sql123
Подскажи, коли не в тягость, как в MERGE проверку сделать сравнение полей, которые уже есть в таблице и которые я на сервер БД гружу?

https://msdn.microsoft.com/en-us/library/bb510625.aspx
12 май 15, 09:53    [17627287]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
sql123
Подскажи, коли не в тягость, как в MERGE проверку сделать сравнение полей, которые уже есть в таблице и которые я на сервер БД гружу?
INSTEAD OF Trigger on View
12 май 15, 22:35    [17631372]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Вот такое нарисовал. Гляньте плиз.
MERGE tovar AS target
    USING tmp_tovar AS source
    ON ((target.id = source.id) AND (target.n_str = source.n_str) AND (target.kolvo <> source.kolvo))
    WHEN MATCHED THEN 
        UPDATE 
			SET kolvo = source.kolvo,
				s_fg = 1
			
	WHEN NOT MATCHED THEN
		INSERT (id, n_str, kontr_id,tovar_id,ser_id,kolvo,summa)
		VALUES (source.id,source.n_str, source.kontr_id,source.tovar_id,source.ser_id,source.kolvo,source.summa)
    ;
25 май 15, 12:00    [17684707]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
iap
Member

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

а какое-нибудь из сравниваемых полей может иметь значение NULL?
25 май 15, 12:03    [17684722]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Glory
Member

Откуда:
Сообщений: 104760
sql123
WHEN NOT MATCHED THEN

Т.е. если
target.id = source.id) AND (target.n_str = source.n_str) AND (target.kolvo = source.kolvo))
то будет добавление новой записи ?
25 май 15, 12:14    [17684796]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Нет.
25 май 15, 12:14    [17684801]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Glory
sql123
WHEN NOT MATCHED THEN

Т.е. если
target.id = source.id) AND (target.n_str = source.n_str) AND (target.kolvo = source.kolvo))
то будет добавление новой записи ?


Ну если записи нет, то надо добавить.
25 май 15, 12:16    [17684811]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
Glory
Member

Откуда:
Сообщений: 104760
sql123
Ну если записи нет, то надо добавить.

Она есть, просто target.kolvo = source.kolvo, что является WHEN NOT MATCHED для вашего target.kolvo <> source.kolvo
25 май 15, 12:17    [17684819]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
Glory,

Ну и как мне тогда мне прикрутить условие на проверить что запись типа уже есть, но ее надо только обновить если она изменилась?
25 май 15, 12:22    [17684848]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
sql123
Ну и как мне тогда мне прикрутить условие на проверить что запись типа уже есть, но ее надо только обновить если она изменилась?
WHEN MATCHED AND target.n_str = source.n_str AND target.kolvo <> source.kolvo THEN
25 май 15, 12:29    [17684881]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
sql123
Guest
invm,

Типа перенести в другой раздел? А что-то же тогда должно быть в ON.
25 май 15, 12:36    [17684922]     Ответить | Цитировать Сообщить модератору
 Re: Проверить запись на различие, если надо то обновить.  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
sql123
А что-то же тогда должно быть в ON.
В ON должны быть условия соединения таблиц. В вашем случае target.id = source.id
25 май 15, 12:42    [17684958]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить