2016-05-16 95 views
0

我正在将记事本txt文件加载到SQL表中。我试图使用BULK INSERT命令,但我不断收到此错误:BULK INSERT SQL,需要分离数据

Msg 4863, Level 16, State 1, Line 8
Bulk load data conversion error (truncation) for row 1, column 3 (column3).

TXT文件具有由|符号分隔每一列。我只需要每个| |之间的每一组文本都在它自己的列中。

例如:

|100|AA|BCD|200| 

我需要每个那些的分离成在一个表中的一列。我的代码可能现在太简单了,但任何帮助,将不胜感激。数据

CREATE TABLE BMData2 (
    column1 varchar(30), 
    column2 varchar(30), 
    column3 character(3), 
    column4 varchar(10), 
    column5 varchar(10), 
    column6 varchar(10), 
    column7 varchar(10), 
    column8 varchar(10), 
    column9 varchar(10), 
    column10 varchar(10), 
    column11 varchar(10), 
    column12 varchar(10), 
    column13 varchar(10), 
    column14 varchar(10), 
    column15 varchar(10), 
    column16 varchar(10), 
    column17 varchar(10), 
    column18 varchar(10), 
    column19 varchar(10), 
    column20 varchar(10), 
    column21 varchar(10), 
    column22 varchar(10), 
    column23 varchar(10), 
    column24 varchar(10), 
    column25 varchar(10), 
    column26 varchar(10), 
) 

BULK INSERT BMData 
FROM '\\DBV\march_june\All march june Data.txt' 
WITH 
(Fieldterminator = '|', 
ROWTERMINATOR = '\n'); 

行看起来是这样的:

AB|1410|MTH|ART|20150401|3|1600|1600|1556|2048|2048|2101|0|0|168|185|-4|13|17|1630|2054|ARTPROJECT|34|7|144||0|0|0|0|0|0|0|0|0||0|0|0|0|||0|0|0|0|||0|0|0|0|||0|0|0|0|||0|0|0|0| 

我真的只需要这些 “数据点”,即5 |数据点|但是我的数据是这样的,并且有很多行,因此在Excel或记事本中清理是不可能的。

+0

mysql或sql-server? – scaisEdge

+0

如果您提供样本数据以及您要插入的表格的定义,这将有所帮助。 – Uueerdo

+0

@scaisEdge SQL-Server – Ben

回答

0

删除文本文件中的列标题。

BULK INSERT (Transact-SQL)

The FIRSTROW attribute is not intended to skip column headers. Skipping headers is not supported by the BULK INSERT statement. When skipping rows, the SQL Server Database Engine looks only at the field terminators, and does not validate the data in the fields of skipped rows.

编辑:您的样本数据不匹配的表,你存在。你的表格有26列,但样本数据有大约两倍。

使用以下测试数据创建一个测试文件(无列标题): 请注意,最后一列有一个NULL值。在最后|之后并在NewLine角色之前。

AB|1410|MTH|ART|20150401|3|1600|1600|1556|2048|2048|2101|0|0|168|185|-4|13|17|1630|2054|ARTPROJECT|34|7|144| 
AB|1410|MTH|ART|20150401|3|1600|1600|1556|2048|2048|2101|0|0|168|185|-4|13|17|1630|2054|ARTPROJECT|34|7|144| 
AB|1410|MTH|ART|20150401|3|1600|1600|1556|2048|2048|2101|0|0|168|185|-4|13|17|1630|2054|ARTPROJECT|34|7|144| 
+0

我删除了它们,但仍然出现此错误:消息4863,级别16,状态1,行31 Bulk加载第1行第3列(第3列)的数据转换错误(截断)。 – Ben

+0

@Ben请参阅修改。 –

0

改为使用xml格式文件。它效果更好。这里是基于@Ricardo C示例数据的示例。 1.准备xml文件并保存(本例中为c:\ temp \ bulk.xml)。

<?xml version="1.0" encoding="utf-8" ?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
     <!--list all fields in your .txt here--> 
     <FIELD ID="1" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="4" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="5" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="6" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="7" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="8" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="9" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="10" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="11" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="12" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="13" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="14" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="15" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="16" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="17" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="18" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="19" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="20" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="21" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="22" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="23" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="24" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="25" xsi:type="CharTerm" TERMINATOR='|' MAX_LENGTH="510" /> 
     <FIELD ID="26" xsi:type="CharTerm" TERMINATOR='\r\n' MAX_LENGTH="510" /> 
     <!-- the last is end of row --> 

    </RECORD> 
    <ROW> 
     <!-- List only what you need --> 
     <COLUMN SOURCE="1" NAME="Id" xsi:type="SQLVARYCHAR"/> 
     <COLUMN SOURCE="2" NAME="Id1" xsi:type="SQLINT"/> 
     <COLUMN SOURCE="3" NAME="Name" xsi:type="SQLVARYCHAR"/> 
    </ROW> 
</BCPFORMAT> 
  • 用法:

    插入dbo.myTable
    SELECT * FROM OPENROWSET(BULK 'C:\ TEMP \ bulk.txt',
    FORMATFILE ='C:\ temp \ bulk.xml'
    )AS t1;

  • 0

    我会使用PowerShell预处理原始文件并只提取我需要的列,并将提取的数据放到新文件中。 比方说,原来的源文件位于C:\ TEMP \ src.txt如下(为简单的过程,第一行把你列名):

    col1|col2|col3|col4|col5|col6|col7|col8|col9|col10 
    1|2|3|4|5|6|7|8|9|10 
    11|12|13|14|15|16|17|18|19|20 
    21|22|23|24|25|26|27|28|29|30 
    31|32|33|34|35|36|37|38|39|40 
    41|42|43|44|45|46|47|48|49|50 
    51|52|53|54|55|56|57|58|59|60 
    61|62|3|64|65|66|67|68|69|70 
    

    现在,让我们说,我只需要获取col2,col4,col5和col9数据。因此,这里的PowerShell代码

    [string[]]$col_wanted = 'col2', 'col4', 'col5', 'col9'; #only need four columns out of 10 columns 
    
    $csv = import-csv -path c:\temp\src.txt -Delimiter '|'; 
    $t=($col_wanted -join "|") + "`r`n"; 
    foreach ($c in $csv) 
    { 
        $col_wanted | % -begin {[string]$s='';} -process {$s+=$c.$_+'|';} -end {$s = $s.Substring(0, $s.Length-1) + "`r`n"} 
        $t += $s 
    } 
    $t | Out-File -FilePath c:\temp\target.txt -Force; 
    

    如果我们打开C:\ TEMP \ target.txt,我们将看到的结果是这样的:

    col2|col4|col5|col9 
    2|4|5|9 
    12|14|15|19 
    22|24|25|29 
    32|34|35|39 
    42|44|45|49 
    52|54|55|59 
    62|64|65|69 
    

    现在你可以使用批量插入办数据导入,但因为我们有第一行作为列头,所以在批量插入中,我们需要设置firstrow = 2,即如下所示

    bulk insert MyTable 
    from 'c:\temp\target.txt' 
    with (FIELDTERMINATOR ='|', firstrow=2);