如何将Oracle中的Blob数据插入到SQL Server的Image数据类型列中
问题解决方法
该场景下需要对Oracle侧采集的BLOB数据做显式类型转换,才可以正确写入SQL Server。
注意事项
- SQL Server的
Image数据类型已被官方标记为弃用,后续版本会移除该类型,建议优先使用VARBINARY(MAX)类型存储二进制图像数据,兼容性和性能表现更好。 - 跨链接服务器读取Oracle BLOB数据时,不要直接使用四部分名称(
链接服务器名..用户名.表名)的方式查询,该方式会导致BLOB数据被隐式转换为非二进制格式,出现数据损坏。
正确插入语句
优先通过OPENQUERY在Oracle侧执行查询获取原生BLOB数据,再显式转换为VARBINARY(MAX)类型后写入目标表,示例如下:
INSERT INTO ICCS_Signature_INW_Test (AccountNumber, Image) SELECT ACCT_NUM, CAST(ORIG_IMAGE AS VARBINARY(MAX)) FROM OPENQUERY(你的Oracle链接服务器名称, ' SELECT ACCT_NUM, ORIG_IMAGE FROM 你的Oracle源表名 WHERE ACCT_NUM = ''123456789'' ')
如果是手动插入单条图像数据,需要先将原始图像数据转换为十六进制字符串,添加0x前缀后直接写入即可:
INSERT INTO ICCS_Signature_INW_Test (AccountNumber, Image) VALUES ('123456789', 0x[完整的图像十六进制编码])
数据一致性校验
插入完成后可通过比对两端的MD5哈希值确认数据是否一致:
- Oracle侧计算原始BLOB的MD5值:
SELECT DBMS_CRYPTO.HASH(ORIG_IMAGE, 2) FROM 你的Oracle源表名 WHERE ACCT_NUM = '123456789';
- SQL Server侧计算写入数据的MD5值:
SELECT HASHBYTES('MD5', Image) FROM ICCS_Signature_INW_Test WHERE AccountNumber = '123456789';
两个查询返回的哈希值完全一致则说明数据插入正确。
内容的提问来源于stack exchange,提问作者Ijas ibrahim
相关产品推荐
相关产品推荐

