BULK INSERT - 二进制数据类型错误

时间:2018-04-23 00:20:29

标签: sql sql-server binary sql-server-2014 bulkinsert

我正在使用sqlcmd将数据写入 文本 文件。此数据包含 二进制数据类型 的列。这是命令:

sqlcmd -E -Q "' + @queryCommand + '" -o "' + @filePath + '" -s "," -W

现在,我正在使用BULK INSERT将该数据导入我的数据库。这是命令(只是导入和部分):

N'BULK INSERT ' + @tableName + ' FROM ''' + @importFilePath + ''' WITH 
      (
          ROWS_PER_BATCH = 10000,
          TABLOCK,
          FIRSTROW = 3,
          FIELDTERMINATOR = '','',
          ROWTERMINATOR = ''\r\n'',
          DATAFILETYPE = ''widenative'',
          codepage = ''1251''
      )'

对于DATAFILETYPE我尝试了 原生 widenative ,以及ROWTERMINATOR 1}}我尝试 0x0a \ r \ n \ n 即可。我认为CODEPAGE在这里是无关紧要的(我在其他答案中找到了它),因为我也没试过它。

我在这里遇到的错误是:

  

批量加载失败。第1行第2列的数据文件中的列太长。验证是否正确指定了字段终止符和行终止符。

当我使用普通BULK INSERT

N'BULK INSERT ' + @tableName + ' FROM ''' + @importFilePath + ''' WITH 
      (
          ROWS_PER_BATCH = 10000,
          TABLOCK,
          FIRSTROW = 3,
          FIELDTERMINATOR = '','',
          ROWTERMINATOR = ''\n''
      )'

我收到以下错误:

  

第3行第10列的批量加载数据转换错误(截断)( 具有二进制数据类型的列 )。

顺便说一下,这就是 text 文件的样子:

SomeId,...,SomethingBinary,...
--,------,-----------,-------------,------
11FF47D0-B4A8-452A-9E3F-41BF201C2669,...,0x010005000A741F2B40208AA43B02000000000000,...

1 个答案:

答案 0 :(得分:2)

好的,花了一段时间,但我发现了几个问题:

首先,您的表定义(在SQLFiddle中)是:

create table [Test]
(
    [Id] uniqueidentifier not null,
    [SomeValue] int not null,
    [BinaryCol] binary not null   -- this is binary(1) !!
);

应该是

create table [Test]
(
    [Id] uniqueidentifier not null,
    [SomeValue] int not null,
    [BinaryCol] varbinary(max) not null  -- or the appropriate size
);

始终指定数据类型的大小!

其次,我使用了从正确的表定义生成的格式文件:

 bcp tmp.dbo.Test format nul -c -x -f C:\temp\Import.xml -t, -T

Output:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="37"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="Id" xsi:type="SQLUNIQUEID"/>
  <COLUMN SOURCE="2" NAME="SomeValue" xsi:type="SQLINT"/>
  <COLUMN SOURCE="3" NAME="BinaryCol" xsi:type="SQLVARYBIN"/>
 </ROW>
</BCPFORMAT>

我不得不删除所有第3列数据的'0x'

Id,SomeValue,BinaryCol
--,---------,---------
3D30DF1B-D67B-4A2D-B79C-EBDC013928C3,1,010005000A741F2B40208AA43B02000000000000
B896ECB2-39A2-4888-9293-DE382BDBA0B7,2,010005000A741F2B40208AA43B02000000000000
7B053980-DD74-48E3-A348-0567A421E958,3,010005000A741F2B40208AA43B02000000000000

然后我导入:

BULK INSERT dbo.Test FROM 'C:\temp\res.txt' WITH 
(
    ROWS_PER_BATCH = 10000,
    TABLOCK,
    FIRSTROW = 3,
    FORMATFILE = 'C:\temp\Import.xml'
)