我有一个数据文件,是从Oracle导出的,提取脚本是这样:select A||'|'||B||'|'||C
from X;我想把这个表的数据导入SQL SERVER,使用 BULK INSERT方法:bulk insert Y
from 'c:\data.log'
with
(
FIELDTERMINATOR='|',
ROWTERMINATOR='{LF}'
)但是总是报错,错误信息是,大容量加载失败。数据文件中第 1 行的第 3 列太长。请验证是否正确指定了字段终止符和行终止符。我用UE查看过数据文件,它换行符确实是 0A 啊,
究竟怎么办、

解决方案 »

  1.   

    BULK INSERT Y
        FROM 'c:\data.log'
    WITH
    (
        FIELDTERMINATOR='|',
        ROWTERMINATOR='\r\n',
        DATAFILETYPE='char'
    );TRY
      

  2.   

    还是不行呢,报错信息如下:消息 4866,级别 16,状态 1,第 1 行
    大容量加载失败。数据文件中第 1 行的第 3 列太长。请验证是否正确指定了字段终止符和行终止符。
    消息 7399,级别 16,状态 1,第 1 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "BULK" 报错。提供程序未给出有关错误的任何信息。
    消息 7330,级别 16,状态 2,第 1 行
    无法从链接服务器 "(null)" 的 OLE DB 访问接口"BULK"提取行。
      

  3.   

    BULK INSERT Y
        FROM 'c:\data.log'
    WITH
    (
        FIELDTERMINATOR='|',
        ROWTERMINATOR='\n',
        DATAFILETYPE='char'
    );
      

  4.   

    联机帮助里面有资料,换行符是:\n下表对“引用列表”中提供的正则表达式进行了说明。表达式  语法  说明  
    任何单个字符
     .
     匹配除换行符外的所有单一字符。
     
    零个或更多
     *
     匹配零或更多前导表达式的匹配项,执行所有可能的匹配。
     
    一个或更多
     +
     匹配至少一个前导表达式的匹配项。
     
    行首
     ^
     仅匹配行首位置的字符串。
     
    行尾
     $
     仅匹配行尾位置的字符串。
     
    字首
     <
     仅匹配文本中以此开头的字。
     
    字尾
     >
     仅匹配文本中以此结尾的字。
     
    分行符
     \n
     匹配与平台无关的换行符。在替换表达式中,插入一个换行符。
     
    在集合中的任何一个字符
     []
     匹配 [] 中的任何一个字符。若要指定字符范围,请列出起始字符和结束字符,并用短划线 (-) 分隔,如 [a-z]。
     
    不在集合中的任何一个字符
     [^...]
     匹配不在 ^ 之后的字符集中的任何一个字符。
     

     |
     匹配“或”符号 (|) 两旁的任一表达式。常用于组中。例如,(sponge|mud) bath 可以匹配“sponge bath”和“mud bath”。
     
    转义
     \
     将反斜杠 (\) 后的字符作为文字匹配。此表达式允许您搜索正则表达式标记中使用的符号,如 { 和 ^。例如, \^ 可用于查找字符 ^。
     
    标记表达式
     {}
     匹配用括起来的表达式内的文本。
     
    C/C++ 标识符
     :i
     匹配表达式 ([a-zA-Z_$][a-zA-Z0-9_$]*)。
     
    用引号括起来的字符串
     :q
     匹配表达式 (("[^"]*")|('[^']*'))。
     
    空格或制表符
     :b
     匹配空格或制表符。
     
    整数
     :z
     匹配表达式 ([0-9]+)。
     
      

  5.   

    没有,第三列是可以是一个空的数据,如数据文件中的部分数据如下:gd|mms|
    beijing|sms|15912345678就像这样
      

  6.   

    BULK INSERT Y
        FROM 'c:\data.log'
    WITH
    (
        FIELDTERMINATOR='|',
        ROWTERMINATOR='\n',
        KEEPNULLS
    );
      

  7.   

    bulk insert Y
    from 'c:\data.log'
    with
    (FIELDTERMINATOR='|')
      

  8.   

    测试了一下,如果最后一列有 null 值,似乎只能通过格式化文件才可以成功导入。-- 格式化文件 fmt.xml
    <?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="10"/>  -- 根据实际情况设置字段长度
        <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" 
          MAX_LENGTH="48"/>
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\n" 
          MAX_LENGTH="48"/>
      </RECORD>
      <ROW>
        <COLUMN SOURCE="1" NAME="A" xsi:type="SQLVARCHAR"/> -- 根据实际情况设置 SQL 类型
        <COLUMN SOURCE="2" NAME="B" xsi:type="SQLVARCHAR"/>
        <COLUMN SOURCE="3" NAME="C" xsi:type="SQLVARCHAR"/>
      </ROW>
    </BCPFORMAT>BULK INSERT Y
    FROM 'c:\data.log'
    with (FORMATFILE='c:\fmt.xml');
      

  9.   

    导入文件的最后段没有数据,也就是在表中对应 null 值。
    以下是在 SQL Server 2008 上进行的测试:
    如果是 dos 格式,ROWTERMINATOR='\n' 可以成功导入,而 ROWTERMINATOR='\r\n'(这个应该是 dos 文本格式的行终结符) 不能成功导入。
    如果是 unix 格式,ROWTERMINATOR='\n' (这个是 unix 文本格式的行终结符)不能成功导入。
    如果使用格式化文件,则可以成功导入。