Перенос из MySql в MsSql

1. LadyInGreen 07.04.22 08:32 Сейчас в теме
Здравствуйте!
Требуется перенос баз из MySql в MsSql. Знаю, что есть помощник по миграции, но он вроде не подойдет (пока не особо четко поставили задачу, но знаю, что по расписанию придется переносить некоторые данные, обновлять их - базы msSql базами MySql).
Я сделала в MsSql link - базы подтянулись из ms sql - то есть их видно, sel ect нормально получается:
sel ect * fr om OPENQUERY (test, 'SEL ECT * FR OM site.b_admin')
Но синтаксис ins ert через openquery мне непонятен :( Вот нашла в форумах формат:
1) INS ERT INTO OPENQUERY (MYSQL, 'SEL ECT * FR OM MySQL_Table')
SEL ECT * FR OM dbo.SQLServer_Table
2) INS ERT IN TO OPENQUERY (MYSQL, 'SELECT * FR OM MySQL_Table')
VALUES ('Value1', 'Val ue2', ...)
В примере №1 непонятно, данные из MySql_table вставляются в dbo.SqlServer ? но почему тогда 2 раза sele ct? в общем, попробовала, не получилось.
В №2 вставляются конкретные значения, написанные в апострофах? А куда вставляются, в текущую базу? В общем, второй пример вообще непонятный.

Может, кто-то сталкивался с переносом таким?
По теме из базы знаний
Найденные решения
13. starik-2005 3087 07.04.22 13:15 Сейчас в теме
(12)
Вот попробовала
ИНСЕРТ ИНТУ Таблица
СЕЛЕКТ * ФРОМ ОПЕНКУЭРИ(блаблабла)
ГО 
18. user1203706 14 07.04.22 14:37 Сейчас в теме
ins ert into changeTest sel ect * from openqery(rest_bitrix3,'sele ct digit,cast(Slovo as char(30)) as slovo fr om  siteadmin.bla-bla-bla')
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 07.04.22 08:56 Сейчас в теме
(1)ээээ....если я правильно понимаю задачу, то миграция между СУБД возможна через выгрузку/загрузку в/из *.dt стандартной функциональнстью конфигуратора 1С.

или речь не про базы 1С?
4. LadyInGreen 07.04.22 09:57 Сейчас в теме
(2) Не про базы 1с тема, но это неважно, так как dt все равно бы не получилось - базы 1с у нас слишком большие, не зальется в них dt :)
5. nomad_irk 76 07.04.22 09:59 Сейчас в теме
(4)чей-то не зальется, если они клиент-серверные? выгрузится может любой объем, а вот загрузится в файловый вариант -
не больше определенного
9. LadyInGreen 07.04.22 11:48 Сейчас в теме
(3) Да, спасибо, это тоже вчера читала :)
Но не пойму: запрос в этой ссылке такой:
INSERT OPENQUERY (OracleSvr, 'SEL ECT name FR OM joe.titles')
VALUES ('NewTitle');

Это перенос из оракл в mssql, вроде? то есть мы из базы joe.titles вставляем куда? NewTitle - это что, значение? а где тут база-приемник?

Допустим, мне надо вставить из базы source - которая на MY sql, базу receiver - которая на MS sql. Как тогда запрос написать? (вернее, наверное, не базами, а таблицами передавать надо).
10. LadyInGreen 07.04.22 11:49 Сейчас в теме
(5) Ну так я и пишу - не зальется :) то есть не загрузится.
3. user1203706 14 07.04.22 08:59 Сейчас в теме
(1) ты же прилинковала сервер, пиши обычный ins ert into sele ct
на счет опенквери почитай в BOL
https://docs.microsoft.com/ru-ru/sql/t-sql/functions/openquery-transact-sql?view=sql-server-ver15
6. user1203706 14 07.04.22 10:01 Сейчас в теме
(2) 1с пока еще не умеет хранить базы в MySql
7. nomad_irk 76 07.04.22 10:04 Сейчас в теме
(6)это да, согласен, но вдруг какими чудесными путями смогли :)
8. starik-2005 3087 07.04.22 11:30 Сейчас в теме
(7) 1С умеет работать с любой СУБД, как с внешним источником (отдельный объект дерева метаданных конфигурации, для которого прописывается строка соединения и выбираются нужные таблицы, которые становятся доступны в 1С). Но нельзя работать с конфигурацией 1С в MySQL, т.к. нет возможности разместить эту конфигурацию там.

А по поводу инсерта, то нужно, видимо, что-то типа "Инсерт инту имя_таблицы_здесь фром опенкуэри(блаблабла)".
12. LadyInGreen 07.04.22 13:00 Сейчас в теме
(8) Про инсерт: я тоже так думала, но в примерах, которые я привела, и на сайте, которые советуют в (3) синтаксис другой, непонятный совсем, и не похож на вставку в MsSql :)
Вот попробовала, как Вы советуете, да и вчера вроде как-то похоже пробовала. Ошибку выдает - во вложении.
Прикрепленные файлы:
13. starik-2005 3087 07.04.22 13:15 Сейчас в теме
(12)
Вот попробовала
ИНСЕРТ ИНТУ Таблица
СЕЛЕКТ * ФРОМ ОПЕНКУЭРИ(блаблабла)
ГО 
14. LadyInGreen 07.04.22 14:23 Сейчас в теме
(13) Опять не угадали :) Вкладываю картинки. Хотя, может, ошибка связана с тем, что типы данных разные? Сейчас запрошу у специалиста по Mysql структуру. Просто значения мне показались похожими по типу на те, что в Ms. Я только значения вижу.

Я еще раз внимательно примеры в форумах посмотрела, и мне кажется, что MsSql при работе со связанными серверами может делать вставку только на стороне My Sql (связанного сервера) :( вот, допустим, из этого примера мне так кажется, очень похоже, что вставка идет именно в MY SQL таблицу. Тут же вообще нет упоминания Mssql таблиц?
INS ERT IN TO OPENQUERY (MYSQL, 'SEL ECT * FR OM MySQL_Table')
VALUES ('Val ue1', 'Val ue2', ...)
Прикрепленные файлы:
15. starik-2005 3087 07.04.22 14:24 Сейчас в теме
(14)
Вкладываю картинки.
Ну вот. Осталось добиться, чтобы количество столбцов в источнике и приемнике было одинаковым, а типы - их можно кастануть. Ну и названия столбцов должны соответствовать (на сколько я знаю, но это алиасами можно решить).
20. LadyInGreen 08.04.22 13:06 Сейчас в теме
(15) Спасибо, получилось! Удалось "достать" структуру базы Ms Sql и все пошло хорошо!

ins ert into test.dbo.test sele ct * from OPENQUERY (test_bitrix3, 'SEL ECT Contact_ID, Contact_NAME FR OM TO_CASCANA.EXPORT_DATA')

То есть в базу Ms Sql переношу 2 столбца только.
Совпадения названия столбцов не требуется. В тестовой базе, которую создала в Ms - вообще по-другому назвала.

Кстати, если длина строки в Ms меньше, чем нужно под данные в My - просто пишет что-то типа: "Извините, строка такая то не влезет, переносить не буду".
23. starik-2005 3087 08.04.22 13:52 Сейчас в теме
(20)
Удалось "достать"
Суровое челябинское программирование...
22. LadyInGreen 08.04.22 13:10 Сейчас в теме
16. user1203706 14 07.04.22 14:24 Сейчас в теме
(14) Если типы не совпадают, делай cast в запросе к мускулу
17. user1203706 14 07.04.22 14:25 Сейчас в теме
Для начала, можешь в запросе указать не * ,а конкретные колонки и их привести к одинаковому типу.
18. user1203706 14 07.04.22 14:37 Сейчас в теме
ins ert into changeTest sel ect * from openqery(rest_bitrix3,'sele ct digit,cast(Slovo as char(30)) as slovo fr om  siteadmin.bla-bla-bla')
21. LadyInGreen 08.04.22 13:09 Сейчас в теме
(18)
cast(Slovo as char(30))


Спасибо, cast попробовала, работает - например, преобразовывает тип text в varchar:

ins ert into test.dbo.test2 sele ct * from OPENQUERY (test_bitrix3, 'SEL ECT Contact_datA_ID, cast(Object_ADDRESS as char(60)) FR OM TO_CASCANA.EXPORT_DATA').

При этом, если строка не влазит, то не ругается (как я написала в пункте 20), все равно переносит, но строку обрезает.
24. user1203706 14 08.04.22 13:56 Сейчас в теме
(21) дык надо кастовать к типу поля в приёмнике, а не наугад..
19. user1203706 14 07.04.22 14:38 Сейчас в теме
Чето через жпо тут вставка кода..накой-то хрен пробелы вставляет, ну да ладно, смысл понятен, надеюсь.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот