Я работаю над переносом базы данных iSeries DB2 на SQL Server (вручную — в настоящее время не использую SSMA). У меня есть столбец DB2 типа varchar(32000). Когда я пытаюсь выполнить запрос из SQL Server с помощью openquery через связанный сервер, я получаю сообщение об ошибке «Запрошенное преобразование не поддерживается». Как я могу перенести эти данные с помощью сценария SQL?
Вот пример запроса через связанный сервер:
select MYVARCHAR32000COLUMN
from openquery(MYDB2LINKEDSERVER, 'select MYVARCHAR32000COLUMN from MYDB2DB.MYDB2TABLE')
OLE DB provider "MSDASQL" for linked server "MYDB2LINKEDSERVER" returned message "Requested conversion is not supported.".
Msg 7341, Level 16, State 2, Line 2304
Cannot get the current row value of column "[MSDASQL].MYVARCHAR320000COLUMN" from OLE DB provider "MSDASQL" for linked server "MYDB2LINKEDSERVER".
@mao - это на iSeries. Как я могу найти «кодовую страницу и территорию»?
Вы должны отредактировать свой вопрос, чтобы указать платформу Db2 (i-серия) в тексте вопроса. Также следует написать версию i-серии. Узнайте у администратора i-series, как получить информацию о версии и кодовой странице. Не используйте комментарии для добавления фактов, потому что они недоступны для поиска.
Если драйвер, предоставленный Microsoft, не сможет выполнить преобразование без проблем, используйте драйвер, предоставленный IBM (например, доступ к серии i).
Вы используете общий поставщик оболочки ODBC. Вам следует попробовать поставщика от IBM или использовать встроенный поставщик DB2, созданный Microsoft (Learn.Microsoft.com/en-us/host-integration-server/…) под названием HIS.
@mao Я добавил это в описание. Я также добавил это в заголовок. Спасибо
Попробую использовать другой драйвер.





Чтобы перенести эти данные, не меняя драйвер связанного сервера, я добавил 4 столбца CLOB в исходную таблицу, а затем преобразовал эти 4 фрагмента как varchar(8000) в мою целевую таблицу SQL Server.
В DB2 (источник):
alter table MYDB2.MYTABLE add MYCOL_1 CLOB;
alter table MYDB2.MYTABLE add MYCOL_2 CLOB;
alter table MYDB2.MYTABLE add MYCOL_3 CLOB;
alter table MYDB2.MYTABLE add MYCOL_4 CLOB;
update MYDB2.MYTABLE set MYCOL_1 = trim(substring(MYCOL, 1, 8000));
update MYDB2.MYTABLE set MYCOL_2 = trim(substring(MYCOL, 8001, 16000));
update MYDB2.MYTABLE set MYCOL_3 = trim(substring(MYCOL, 16001, 24000));
update MYDB2.MYTABLE set MYCOL_4 = trim(substring(MYCOL, 24001, 32000));
Затем на SQL Server (назначение):
select cast(MYCOL_1 as varchar(8000)) + cast(MYCOL_2 as varchar(8000)) + cast(MYCOL_3 as varchar(8000)) + cast(MYCOL_4 as varchar(8000)) MYCOL
from openquery(MYDB2LINKEDSERVER, 'select MYCOL_1, MYCOL_2, MYCOL_3, MYCOL_4 from MYDB2.MYTABL')
Какова платформа (z/os, i-series, linux/unix/window/cloud), кодовая страница и территория базы данных Db2? Вам нужна эта информация, чтобы понять, какие преобразования требуются и как лучше всего добиться преобразования (т. е. с помощью какого драйвера).