从CSV向MS SQL的varbinary字段批量插入时遇转换截断错误
解决BULK INSERT导入十六进制图像数据的截断错误
1. 修正临时表字段长度
截断错误大概率是临时表的images列长度不足导致的,别用固定长度的VARCHAR,直接用MAX类型容纳长十六进制字符串:
CREATE TABLE #TempImageHex ( ObjectId INT, ImageHex VARCHAR(MAX) -- 用MAX类型避免长度不够引发的截断 )
2. 调整BULK INSERT参数
Windows系统下的CSV行终止符通常是\r\n而非单纯的\n,加上编码参数避免字符转换问题:
BULK INSERT #TempImageHex FROM 'D:\Images.csv' WITH ( ROWTERMINATOR = '\r\n', FIELDTERMINATOR = ';', FIRSTROW = 1, CODEPAGE = 'RAW' -- 跳过字符编码转换,防止数据损坏或截断 )
3. 十六进制转二进制插入目标表
导入临时表后,用CONVERT函数把十六进制字符串转成二进制数据,再写入目标表:
-- 假设目标表名为ImageTable INSERT INTO ImageTable (ID, Body) SELECT ObjectId, CONVERT(VARBINARY(MAX), ImageHex, 2) -- 参数2表示输入是不带0x前缀的十六进制字符串 FROM #TempImageHex
额外排查点
- 如果CSV里的十六进制字符串带引号或空格,导入后要清理,比如用
REPLACE(ImageHex, '"', '')去掉引号 - 要是十六进制字符串开头带
0x,把CONVERT的第三个参数改成1即可 - 确认CSV文件的分隔符确实是
;,没有被其他字符干扰
内容的提问来源于stack exchange,提问作者Twinkles
相关产品推荐
相关产品推荐

