我处理相同问题的方法是以十六进制从 DB2 中提取数据,但将其转换为 VARCHAR。结果数据集作为 VARCHAR 列存储在 MSSQL 暂存表中。最后一步是读取这个具有 HEX 值的 VARCHAR 列并将它们转换为 ASCII 字符。以上所有步骤均使用 SSIS 执行。
这是使用的两个 MS SQL 表。第一个表 F00165_stage 用于存储来自 DB2 的数据。 cmets 列将 HEX 数据存储为 VARCHAR。第二个最终表是存储转换为 ASCII 字符的 HEX 数据。
CREATE TABLE [dbo].[F00165_stage](
[SDKCOO] [nvarchar](5) NULL,
[SDDOCO] [int] NULL,
[SDDCTO] [nvarchar](2) NULL,
[SDLNID] [int] NULL,
[comments] [nvarchar](500) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[final_table](
[SDKCOO] [nvarchar](5) NULL,
[SDDOCO] [int] NULL,
[SDDCTO] [nvarchar](2) NULL,
[SDLNID] [int] NULL,
[comments] [nvarchar](100) NULL
) ON [PRIMARY]
这里是使这项工作的脚本。我正在检索存储在 F00165 中的销售 cmets (F4211)。
第一步是从 JDE 检索数据。链接到 F00165 的密钥可能以不同的方式存储,因此请根据需要进行必要的更改。
SELECT sd.sdkcoo
,sd.sddoco
,sd.sddcto
,sd.sdlnid
,CAST(HEX(gd.gdtxft) AS VARCHAR(500)) comments
FROM F4211 sd
LEFT JOIN F00165 gd ON gd.gdobnm='GT4211A' AND gd.gdtxky=sd.sddoco || '|' || sd.sddcto || '|' || sd.sdkcoo || '|' || CAST((sd.sdlnid / 1000) AS NUMERIC(8,3))
WHERE 1=1
AND CAST(HEX(gd.gdtxft) AS VARCHAR(500)) IS NOT NULL
第二步是在最终表中插入 JDE 记录。
INSERT INTO final_table
SELECT sdkcoo,sddcto,sddoco,sdlnid,'' AS comments
FROM F4211_stage
最后一步是对 HEX (cmets) 列执行更新。这会将 HEX 值转换为 ASCII 字符。
UPDATE ft SET ft.comments=SUBSTRING(CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), REPLACE(st.comments,'00',''), 2)),1,100)
FROM final_table ft
JOIN F4211_stage st ON st.sdkcoo=ft.sdkcoo AND st.sddoco=ft.sddoco AND st.sddcto=ft.sddcto AND st.sdlnid=ft.sdlnid