通过链接服务器查询iSeries DB2 varchar(32000)列遇转换错误的解决
解决DB2 varchar(32000)列迁移至SQL Server的脚本方案
这个错误是因为MSDASQL驱动无法处理DB2超长varchar字段到SQL Server的直接转换,以下是几种可行的脚本迁移方法:
方法1:拆分长字段后拼接导入
在DB2查询里把32000长度的字段拆分成多个8000长度的片段(SQL Server varchar单段最大支持8000),在SQL Server端拼接后插入目标表:
拆分查询并拼接
-- 插入到SQL Server目标表 INSERT INTO 你的目标表名(目标长字段名) SELECT ISNULL(COL_PART1, '') + ISNULL(COL_PART2, '') + ISNULL(COL_PART3, '') + ISNULL(COL_PART4, '') FROM ( -- 从DB2链接服务器拆分读取长字段 SELECT CAST(SUBSTR(MYVARCHAR32000COLUMN, 1, 8000) AS VARCHAR(8000)) AS COL_PART1, CAST(SUBSTR(MYVARCHAR32000COLUMN, 8001, 8000) AS VARCHAR(8000)) AS COL_PART2, CAST(SUBSTR(MYVARCHAR32000COLUMN, 16001, 8000) AS VARCHAR(8000)) AS COL_PART3, CAST(SUBSTR(MYVARCHAR32000COLUMN, 24001, 8000) AS VARCHAR(8000)) AS COL_PART4 FROM OPENQUERY(MYDB2LINKEDSERVER, ' SELECT MYVARCHAR32000COLUMN FROM MYDB2DB.MYDB2TABLE ') ) AS 临时表
方法2:先导出为文件再批量导入
步骤1:在iSeries端导出DB2数据
执行DB2的EXPORT命令把数据导出为文本文件(比如CSV):
EXPORT TO /tmp/long_data.csv OF DEL SELECT MYVARCHAR32000COLUMN, 其他需要迁移的字段 FROM MYDB2DB.MYDB2TABLE
注意:替换路径、字段名,确保导出文件包含所有需要的列。
步骤2:SQL Server端批量导入
把导出的文件传到SQL Server服务器,用BULK INSERT导入:
BULK INSERT 你的目标表名 FROM 'D:\导入文件路径\long_data.csv' WITH ( FIELDTERMINATOR = ',', -- 分隔符和导出时一致 ROWTERMINATOR = '\n', CODEPAGE = '65001', -- 字符集,UTF-8用65001,GBK用936,根据实际调整 MAXERRORS = 0 )
目标表的对应字段要设置为VARCHAR(MAX)或NVARCHAR(MAX)。
方法3:更换链接服务器驱动
如果能切换到IBM官方的OLE DB Provider for DB2(不要用MSDASQL),该驱动对超长字段支持更好,配置完成后直接执行原查询即可:
SELECT MYVARCHAR32000COLUMN FROM OPENQUERY(MYDB2LINKEDSERVER, ' SELECT MYVARCHAR32000COLUMN FROM MYDB2DB.MYDB2TABLE ')
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

