BLUK INSERT导入数据,想必大家都用过的吧。
最近刚接触过找个,有些疑问想请教大家:
1.关于formatfile到底是应该是个什么样子的格式,里面的内容到底是个什么样的。
2.我目前需要做的的 将一个文本文档A.TXT(里面不包括标题),以空格还是TALBE形式分隔开的的数据,一共51列。导入到数据库里面的表A里面去,找个表A里面一共有41个字段,和A.TXT里面的前面的41列是一一对应的。
3.我现在的问题就是 导入的时候一直出现截断字符串。一直很悲剧
提问我要如何就取前面的41列呢,另外就是字段分隔符是| 这个竖线。第二个问题就是。 另外一个文本文档,什么都分隔符都没有,就是按固定长度来放字段的,去的的时候 我只要去获取每一行的第几个字段到到第几个字符,这个又要怎么做。(比如字段A是  第一个字符到第3个字符; 字段B是第4个到第5个字符;字段N是 第N到N+3个字符)看了2天的文档确实理解不到 关于调用FORMATFILE这个的头绪,能来个达人讲讲到底 从MSSQL 的EXEC命令传入之后,到最后导入了表这个过程中,系统到底做了什么啊。

解决方案 »

  1.   

    字段分隔符 |  换行符 /n阶段字符串可能是你表里面定义的字符长度太小,放大点导入试试!你可以先从TXT里拷贝几行出来弄个简单的TXT导入,格式先弄好。
      

  2.   

    格式固定可用(指定字段终止符和行终止符)
    http://technet.microsoft.com/zh-cn/library/ms191485(SQL.90).aspx
    BULK INSERT--可直接用
    http://technet.microsoft.com/zh-cn/library/ms188365(SQL.90).aspx
    参照
    http://technet.microsoft.com/zh-cn/library/ms178129(SQL.90).aspx
      

  3.   

    1.联机丛书都是有具体的格式的。2005还可以使用xml格式化文件。2.分隔符应该采用数据中不会存在的字符,否则会出现分隔错误。
    第二个关于固定分隔长度的,我以前的帖子有。
      

  4.   

    DATAFILETYPE = 'char'
     指定将数据字段作为字符数据加载。
     
    就是这个我看不明白呢,这个CHAR 我要怎么是让SQL知道我是要到第41列就完毕了呢
      

  5.   

    刚才仔细观察了数据 原始数据是
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    最后导入到数据库是:
    F1 F2 F3 F4 F5
    A  B  C  D  E
    A  B  C  D  E
    A  B  C  D  E
    A  B  C  D  E
    其余的列就不用了。
    列的顺序是重新排列过的。
      

  6.   

    BULK INSERT 表名
        FROM 'C:\Test.txt'
    WITH
    (
        FIELDTERMINATOR='|',
        ROWTERMINATOR='/n',
        DATAFILETYPE='char'
    );
      

  7.   

    BULK INSERT 库名..表名 
    FROM 'c:\test.txt' 
    WITH ( 
    FIELDTERMINATOR = ';', 
    ROWTERMINATOR = '\n' 
    ) 那个 CHAR就是分隔符
      

  8.   

    d:\test.txt 内容A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Y
    A|D|E|G|C|B|Z|Yd:\format.fmt 内容9.0
    8
    1       SQLCHAR       0       10      "|"      1     F1       Chinese_PRC_CI_AS
    2       SQLCHAR       0       10      "|"      4     F2       Chinese_PRC_CI_AS
    3       SQLCHAR       0       10      "|"      5     F3       Chinese_PRC_CI_AS
    4       SQLCHAR       0       10      "|"      0     F4       Chinese_PRC_CI_AS
    5       SQLCHAR       0       10      "|"      3     F5       Chinese_PRC_CI_AS
    6       SQLCHAR       0       10      "|"      2     F6       Chinese_PRC_CI_AS
    7       SQLCHAR       0       10      "|"      0     F7       Chinese_PRC_CI_AS
    8       SQLCHAR       0       10      "\r\n"   0     F8       Chinese_PRC_CI_AS脚本:
    create table tb(F1 varchar(10),F2 varchar(10),F3 varchar(10),
        F4 varchar(10),F5 varchar(10))
    BULK INSERT tb FROM 'd:\test.txt' WITH(FORMATFILE='D:\format.fmt')SELECT * FROM tb/*
    F1         F2         F3         F4         F5
    ---------- ---------- ---------- ---------- ----------
    A          B          C          D          E
    A          B          C          D          E
    A          B          C          D          E
    A          B          C          D          E
    A          B          C          D          E(5 行受影响)
    */
      

  9.   

    本帖最后由 roy_88 于 2011-11-25 00:08:21 编辑
      

  10.   

    等于说 这个XML格式是直接生成后在做调整的,不是自己写的哦
    然后下面的ROW这个是对应重新排列的顺序和字段名。
    那么
    1.用源数据表生成XML格式。
    2.调整ROW里面的字段和NAME,和目标表中的字段格式一致。
    3.调用BUIK导入到目标表。
      

  11.   

    不需要自己写,通过表生成就行了,再用格式化导入,txt会按xml格式导入数据库
      

  12.   

    exec master.sys.xp_cmdshell 'bcp DATA.dbo.SUP format nul  -c -x -f d:\Aformat\myTeam.Xml -t"|" -S".\SQLEXPRESS" -U"sa" -P"123456@"'
    我的怎么是这个错误呢
    SQLState = 08001, NativeError = -1
    Error = [Microsoft][SQL Server Native Client 10.0]SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF]. 
    SQLState = 08001, NativeError = -1
    Error = [Microsoft][SQL Server Native Client 10.0]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is config
    ured to allow remote connections. For more information see SQL Server Books Online.
    SQLState = S1T00, NativeError = 0
    Error = [Microsoft][SQL Server Native Client 10.0]Login timeout expired
    NULL
      

  13.   

    目前碰到个意外情况,能正常运行了。出了我要导入的的表。
    我把需要导入的数据直接IMPORT到数据库里面,然后系统生成了一个表,我想把这个表生成XML的格式,
    然后提示:SQLSate=HY000.NativeError =0
    Error=Microsoft sql server native client 10.0 sql Server xml
    格式文件中的字段2的序号无效。
    这个序号无效是指什么啊
      

  14.   

    <?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="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="9" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="10" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="150" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="11" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="150" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="12" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="150" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="13" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="150" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="14" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="15" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="16" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="17" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="18" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="19" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="20" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="50" COLLATION="Chinese_PRC_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="19" NAME="storecode" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="5" NAME="CnName" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="6" NAME="EnName" xsi:type="SQLVARYCHAR"/>
       </ROW>
    </BCPFORMAT>这个文档对不对呢 我这样修改好像还是不行
    Line 79 in format file "d:\Program\format\SUP.xml": duplicate element id reference "25".
      

  15.   

    如果不是要参数化地作为日常工作来处理的内容,最好不要用BCP去导,在导入向导里可以很好地进行列的映射处理.