Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE в БД MySQL из MS SQL (через Linked Server) / 9 сообщений из 9, страница 1 из 1
10.11.2017, 17:19
    #39551212
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
Доброго всем времени суток!
Моя проблем касается и MySQL и MS SQL, но всё-таки решил уточнить её здесь.
Задача: со стороны MS SQL сервера обновить данные в таблице MySQL. Но UPDATE должен быть с соединением таблиц.

Я написал такой UPDATE:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	UPDATE OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ') 
	SET course = @CurrRate 
	, saldo = db.Дебет
	FROM OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ')  rem_k
	LEFT OUTER JOIN 
									(
										Select [Тип], [Контрагент], [Дебет Начало], [Кредит Начало], [Дебет], [Кредит], [Дебет Конец], [Кредит Конец], [Менеджер] 
										From dbo.отчетДебиторка (@DateBegin,@DateEnd,0)
										WHERE not ([Дебет Начало]=0 AND [Кредит Начало]=0 AND [Дебет]=0 AND [Кредит]=0 AND [Дебет Конец]=0 
										AND [Кредит Конец]=0)
									) db ON  rem_k.contragent = db.[Контрагент] 



После его выполнения, в целевой таблице на стороне MySQL - у всех записей поле saldo обновилось значением первой строки результата запроса, который я использую для UPDATE.

Если я пробую вывести результат на стороне MS SQL запросом, который используется в UPDATE - то значения получаются те , что надо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	SELECT rem_k.contragent
	, db.Дебет
	FROM OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ')  rem_k
	LEFT OUTER JOIN 
									(
										Select [Тип], [Контрагент], [Дебет Начало], [Кредит Начало], [Дебет], [Кредит], [Дебет Конец], [Кредит Конец], [Менеджер] 
										From dbo.отчетДебиторка (@DateBegin,@DateEnd,0)
										WHERE not ([Дебет Начало]=0 AND [Кредит Начало]=0 AND [Дебет]=0 AND [Кредит]=0 AND [Дебет Конец]=0 
										AND [Кредит Конец]=0)
									) db ON  rem_k.contragent = db.[Контрагент] 



Вопрос: что я делаю не так? MySQL вообще
...
Рейтинг: 0 / 0
10.11.2017, 17:21
    #39551213
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
вот результат на стороне MS SQL:
...
Рейтинг: 0 / 0
10.11.2017, 17:23
    #39551217
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
Romka-Fes,

"MySQL вообще" - опечатался, имелось в виду "MySQL вообще понимает такие UPDATE?"
...
Рейтинг: 0 / 0
10.11.2017, 17:24
    #39551218
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
Версия MySQL: 5.6.27-75.0-log
...
Рейтинг: 0 / 0
11.11.2017, 09:47
    #39551383
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
Пока выкрутился путём записи новых данных в временную таблицу и UPDATE на стороне MySQL через JOIN с ней:

Код: sql
1.
update kontragents AS k INNER JOIN tmp_kontragents t ON k.kid = t.kid SET k.saldo = t.saldo, k.manager = t.manager



Но проблема таки имеет место быть. То-ли это MySQL ODBC драйвер такое вытворяет, то ли сам MySQL. Вот в чём вопрос....
...
Рейтинг: 0 / 0
11.11.2017, 12:32
    #39551435
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
Romka-Fes,

А почему внешнее соединение? Т.е. почему LEFT OUTER JOIN, а не просто JOIN ?
...
Рейтинг: 0 / 0
12.11.2017, 09:26
    #39551645
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
miksoft,

потому что не по каждому контрагенту может быть соответствующая запись из таблицы, с которой я делаю соединение. На скрине выше видно много NULL в поле [Дебет]. Если я сделаю JOIN - то в результате будут только те контрагенты, у которых есть деб. задолженность. А это совсем не то, что мне нужно.
...
Рейтинг: 0 / 0
12.11.2017, 15:35
    #39551719
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
Romka-Fesмного NULL в поле [Дебет]Ну если вас устраивает, что в поле saldo будет записан NULL, то пусть так.

Попробуйте как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UPDATE OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ') rem_k 
	LEFT OUTER JOIN 
									(
										Select [Тип], [Контрагент], [Дебет Начало], [Кредит Начало], [Дебет], [Кредит], [Дебет Конец], [Кредит Конец], [Менеджер] 
										From dbo.отчетДебиторка (@DateBegin,@DateEnd,0)
										WHERE not ([Дебет Начало]=0 AND [Кредит Начало]=0 AND [Дебет]=0 AND [Кредит]=0 AND [Дебет Конец]=0 
										AND [Кредит Конец]=0)
									) db ON  rem_k.contragent = db.[Контрагент]
	SET rem_k.course = @CurrRate 
	, rem_k.saldo = db.Дебет

Я не знаю синтаксис MS SQL, писал по аналогии из документации по MySQL.
...
Рейтинг: 0 / 0
13.11.2017, 10:36
    #39552007
Romka-Fes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE в БД MySQL из MS SQL (через Linked Server)
miksoft,

Для MS SQL Server это некорректный синтаксис.
Именно такой update я делаю на самом MySQL, предварительно записав нудные для обновления данные во временную таблицу.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE в БД MySQL из MS SQL (через Linked Server) / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]