Ошибка запроса столбца iSeries DB2 varchar(32000) из SQL Server через связанный сервер

Я работаю над переносом базы данных 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".

Какова платформа (z/os, i-series, linux/unix/window/cloud), кодовая страница и территория базы данных Db2? Вам нужна эта информация, чтобы понять, какие преобразования требуются и как лучше всего добиться преобразования (т. е. с помощью какого драйвера).

mao 17.01.2023 14:35

@mao - это на iSeries. Как я могу найти «кодовую страницу и территорию»?

Jeremy 17.01.2023 14:36

Вы должны отредактировать свой вопрос, чтобы указать платформу Db2 (i-серия) в тексте вопроса. Также следует написать версию i-серии. Узнайте у администратора i-series, как получить информацию о версии и кодовой странице. Не используйте комментарии для добавления фактов, потому что они недоступны для поиска.

mao 17.01.2023 14:50

Если драйвер, предоставленный Microsoft, не сможет выполнить преобразование без проблем, используйте драйвер, предоставленный IBM (например, доступ к серии i).

mao 17.01.2023 14:52

Вы используете общий поставщик оболочки ODBC. Вам следует попробовать поставщика от IBM или использовать встроенный поставщик DB2, созданный Microsoft (Learn.Microsoft.com/en-us/host-integration-server/…) под названием HIS.

Conor Cunningham MSFT 17.01.2023 15:50

@mao Я добавил это в описание. Я также добавил это в заголовок. Спасибо

Jeremy 18.01.2023 00:29

Попробую использовать другой драйвер.

Jeremy 18.01.2023 00:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы перенести эти данные, не меняя драйвер связанного сервера, я добавил 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')

Другие вопросы по теме