从 csv 批量插入到 varbinary 字段。批量加载数据转换错误

Bulk insert to varbinary field from csv. Bulk load data conversion error

提问人:Twinkles 提问时间:10/10/2023 最后编辑:Dan GuzmanTwinkles 更新时间:10/10/2023 访问量:47

问:

我有一个包含两列的 csv 文档:对象编号 (int) 及其二进制形式的 png 图像。该表具有以下结构:

编号 身体

ID 字段包含对象标识符(1、2、3 等),body 字段包含以下形式的二进制表示形式:

89504E470D0A1A0A0000000D4948445200000319000002340802000000FEC473F40001000049444154789CECFD599364D9751E0AEEE1CC83CF4378CC915365660D59857920C84B0D26F24ABC4DB559DBFD017AD0A34C6F32BDF77D947E80CCD4BA6D46F151EA36C9244A0401168881280228546565E5109991317BF8EC679EF6DEFDF0453812852A80455611C06D6C4BF38CF0703F (and a lot more signs)

我需要将此数据插入到 MS SQL 表中。因此,最终它们被正确记录并显示为图像。

我尝试进行BULK INSERT查询,但它不起作用。

bulk insert #TempImageHex 
 FROM 'D:\Images.csv'
 WITH (
  rowterminator = '\n',
  fieldterminator = ';',
  firstrow = 1)

给出以下错误:第 1 行第 2 列(图像)的批量加载数据转换错误(截断)。

sql-server sql-server-2008 大容量插入

评论

1赞 Thom A 10/10/2023
仅供参考,SQL Server 2008 已经完全不受支持了 4 年多;您就该实施(大概)最终确定的升级计划了。
0赞 Twinkles 10/10/2023
我知道,但我目前的工作项目正是使用了这一点。更新过程太耗时
0赞 siggemannen 10/10/2023
#TempImageHex 的表定义是什么
0赞 siggemannen 10/10/2023
确实有效rowterminator = '0x0a'

答:

2赞 Dan Guzman 10/10/2023 #1

您需要将十六进制字符串转换为 才能导入二进制值。varbinary

将数据导入临时表,然后与函数一起使用,将十六进制字符串转换为最终表的二进制。varchar(MAX)INSERT...SELECTCONVERT

CREATE TABLE #TempImageHexString(
      ID int NOT NULL
    , BodyHexString varchar(MAX)
);

CREATE TABLE #TempImageHex(
      ID int NOT NULL
    , Body varbinary(MAX)
);

BULK INSERT #TempImageHexString
FROM 'D:\Images.csv'
WITH (
  ROWTERMINATOR = '\n',
  FIELDTERMINATOR = ';',
  FIRSTROW = 1);

INSERT INTO #TempImageHex (ID, Body)
    SELECT ID, CONVERT(varbinary(MAX), BodyHexString, 0)
    FROM #TempImageHexString;