zoukankan      html  css  js  c++  java
  • SQL Server BCP使用小结


    用法: bcp {dbtable 
    | query} {in | out | queryout | format} 数据文件
      
    [-m 最大错误数]             [-f 格式化文件]         [-e 错误文件]
      
    [-F 首行]                   [-L 末行]             [-b 批大小]
      
    [-n 本机类型]               [-c 字符类型]         [-w 宽字符类型]
      
    [-N 将非文本保持为本机类型] [-V 文件格式版本]     [-q 带引号的标识符]
      
    [-C 代码页说明符]           [-t 字段终止符]       [-r 行终止符]
      
    [-i 输入文件]               [-o 输出文件]         [-a 数据包大小]
      
    [-S 服务器名称]             [-U 用户名]           [-P 密码]
      
    [-T 可信连接]               [-v 版本]             [-R 允许使用区域设置]
      
    [-k 保留空值]               [-E 保留标识值]
      
    [-h"加载提示"]              [-x 生成xml 格式化文件]


    --不利用格式化文件的导入导出(以下示例皆省略了-S参数,因为是在本机,又是默认实例)
    --
    简单导出表
    exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list  out c:\a.xls -c -T'    --"-T"信任连接
    exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list  out c:\a.txt -c -Usa -Pxxxxx'
    --过滤导出表
    exec master..xp_cmdshell 'bcp "select top 3 * from db_oa.dbo.t_user_list"  queryout c:\a.txt -c -T'
    --简单导入表
    exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list_2  in c:\a.txt -c -T'
    exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list_2  in c:\a.txt -c -T -E'    --加上"-E"启用identity_insert on


    --下面是利用XML格式化文件进行数据的导入!
    --
    创建测试表
    USE db_oa;
    GO
    CREATE TABLE myTestFormatFiles (
       Col1 
    smallint,
       Col2 
    nvarchar(50),
       Col3 
    nvarchar(50),
       Col4 
    nvarchar(50)
       );
    GO

    --输出XML格式化文件
    --
    说明一下:-t","是指定字段分隔符,稍后我们会讲到
    exec master..xp_cmdshell 'bcp db_oa..MyTestFormatFiles format nul -c -t"," -x -f c:\myTestFormatFiles.Xml -T'

    /*
    格式化后的文件内容如下:

    <?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="7"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
      <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLSMALLINT"/>
      <COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLNVARCHAR"/>
      <COLUMN SOURCE="3" NAME="Col3" xsi:type="SQLNVARCHAR"/>
      <COLUMN SOURCE="4" NAME="Col4" xsi:type="SQLNVARCHAR"/>
     </ROW>
    </BCPFORMAT>

    这里我们对文件关键字稍作解释:
        <RECORD>父节点中的内容是对源文件的格式化定义,即你要导入的数据文件
            <FIELD ID="1"(这里是源数据字段ID) xsi:type="CharTerm"(字段类型) TERMINATOR=","(字段分隔符) MAX_LENGTH="7"(最大长度)/>
                不难看出,我们最常修改的就是TERMINATOR,可以修改为"|"等你需要的分隔符,注意最后一个字段的分隔符为"\r\n"
        </RECORD>
        <ROW>该父节点的内容是目标数据的格式化定义,即你需要导入数据文件的地方
            <COLUMN SOURCE="1"(这个非常重要,指定的是上面源数据的字段ID,当源数据和目标数据字段顺序或数目不一致时,我们可以修改这里达到我们想要的结果) NAME="Col1"(目标字段名称) xsi:type="SQLSMALLINT"(目标字段类型)/>
        </ROW>
    */
    --下面我们创建源数据文件,将以下内容粘贴到我们指定的数据文件C:\myTestFormatFiles-c.txt中
    /*

        10,Field2,Field3,Field4
        15,Field2,Field3,Field4
        46,Field2,Field3,Field4
        58,Field2,Field3,Field4
    */
    --利用bcp格式化文件导入数据
    exec master..xp_cmdshell 'bcp db_oa..myTestFormatFiles in C:\myTestFormatFiles-c.txt -f C:\myTestFormatFiles.Xml -T'
    --查看一下导入的数据
    select * from myTestFormatFiles
    /*
        Col1    Col2    Col3    Col4
        10    Field2    Field3    Field4
        15    Field2    Field3    Field4
        46    Field2    Field3    Field4
        58    Field2    Field3    Field4
    */


    --使用BULK INSERT导入数据
    USE db_oa;
    GO
    DELETE myTestFormatFiles;
    GO
    BULK INSERT myTestFormatFiles 
       
    FROM 'C:\myTestFormatFiles-c.txt' 
       
    WITH (FORMATFILE = 'C:\myTestFormatFiles.Xml');
    GO
    SELECT * FROM myTestFormatFiles;
    GO
    /*
        Col1    Col2    Col3    Col4
        10    Field2    Field3    Field4
        15    Field2    Field3    Field4
        46    Field2    Field3    Field4
        58    Field2    Field3    Field4
    */


    --使用OPENROWSET 大容量行集提供程序导入
    USE db_oa;
    DELETE myTestFormatFiles;
    GO
    INSERT INTO myTestFormatFiles
        
    SELECT *
          
    FROM  OPENROWSET(BULK  'C:\myTestFormatFiles-c.txt',
          FORMATFILE
    ='C:\myTestFormatFiles.Xml'     
          ) 
    as t1 ;
    GO
    SELECT * FROM myTestFormatFiles;
    GO
    /*
        Col1    Col2    Col3    Col4
        10    Field2    Field3    Field4
        15    Field2    Field3    Field4
        46    Field2    Field3    Field4
        58    Field2    Field3    Field4
    */

    --删除测试表
    DROP TABLE myTestFormatFiles
  • 相关阅读:
    基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)
    VC断点失败的原因之中的一个
    由易到难学习递归的精华
    【特征检測】BRIEF特征点描写叙述算法
    POJ 2386 Lake Counting
    Design Pattern 设计模式1
    使用 InstallShield 制作 Delphi 软件安装包
    在64位系统上部署BDE的要点
    SQL SERVER 存储过程中SELECT 返回值如何赋值给变量
    sql语句中的insert 和 insert into 的区别?into有什么用?
  • 原文地址:https://www.cnblogs.com/zc_0101/p/1807291.html
Copyright © 2011-2022 走看看