BULK INSERT SQL,需要分离数据

时间:2016-05-16 20:33:26

标签: sql sql-server

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

  

Msg 4863,Level 16,State 1,Line 8
  第1行第3列(第3列)的批量加载数据转换错误(截断)。

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|

数据线如下所示:

{{1}}

我真的只需要其中的5个"数据点"即|数据点|但是我的数据是这样的,有很多行,在Excel或记事本中清理是不可能的。

3 个答案:

答案 0 :(得分:0)

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

BULK INSERT (Transact-SQL)

  

FIRSTROW属性不用于跳过列标题。   BULK INSERT语句不支持跳过标头。什么时候   在跳过行时,SQL Server数据库引擎仅查看该字段   终止符,并不验证跳过的字段中的数据   行。

修改:您的示例数据与您提供的表格不匹配。您的表有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|

答案 1 :(得分: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>
  1. 用法:

    插入dbo.myTable
      选择 *   来自OPENROWSET(BULK&#39; C:\ temp \ bulk.txt&#39;,
      FORMATFILE =&#39; C:\ TEMP \ bulk.xml&#39;
       )AS t1;

答案 2 :(得分: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);