Здравствуйте!
Требуется перенос баз из 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 вставляются конкретные значения, написанные в апострофах? А куда вставляются, в текущую базу? В общем, второй пример вообще непонятный.
(1)ээээ....если я правильно понимаю задачу, то миграция между СУБД возможна через выгрузку/загрузку в/из *.dt стандартной функциональнстью конфигуратора 1С.
(3) Да, спасибо, это тоже вчера читала :)
Но не пойму: запрос в этой ссылке такой:
INSERT OPENQUERY (OracleSvr, 'SEL ECT name FR OM joe.titles')
VALUES ('NewTitle');
Это перенос из оракл в mssql, вроде? то есть мы из базы joe.titles вставляем куда? NewTitle - это что, значение? а где тут база-приемник?
Допустим, мне надо вставить из базы source - которая на MY sql, базу receiver - которая на MS sql. Как тогда запрос написать? (вернее, наверное, не базами, а таблицами передавать надо).
(7) 1С умеет работать с любой СУБД, как с внешним источником (отдельный объект дерева метаданных конфигурации, для которого прописывается строка соединения и выбираются нужные таблицы, которые становятся доступны в 1С). Но нельзя работать с конфигурацией 1С в MySQL, т.к. нет возможности разместить эту конфигурацию там.
А по поводу инсерта, то нужно, видимо, что-то типа "Инсерт инту имя_таблицы_здесь фром опенкуэри(блаблабла)".
(8) Про инсерт: я тоже так думала, но в примерах, которые я привела, и на сайте, которые советуют в (3) синтаксис другой, непонятный совсем, и не похож на вставку в MsSql :)
Вот попробовала, как Вы советуете, да и вчера вроде как-то похоже пробовала. Ошибку выдает - во вложении.
(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) Спасибо, получилось! Удалось "достать" структуру базы 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 - просто пишет что-то типа: "Извините, строка такая то не влезет, переносить не буду".
Спасибо, 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), все равно переносит, но строку обрезает.