引言

导入数据到SQL Server 是常见的需求,特别是定期导入这种需求。

对于定期导入主要有以下几种方式可选择:

  1. Bulk Insert
  2. Bcp Utility
  3. OpenRowSet
  4. 写程序导入(使用poi, npoi, ExcelDataReader 等各种组件导入导出,后面不做描述)

接下来我们详细分析下他们的特点和要求

Bulk Insert

执行环境:SQL Server,属于Transact SQL, 可在查询窗口和存储过程中运行。

支持版本:从SQL Server2008开始支持

语法详见:MSDN Bulk Insert

功能特点:支持txt, csv等有分隔符分割数据的文件,因CSV不支持多个sheet, 所以Bulk Insert只支持导入单个文件。

使用举例:

在SP中使用,数据文件和分隔符是可变的,所以使用下面的方式:

强调几个比较重要的配置:

  • FilePath:对于@p_filePath,如果是远程磁盘,需使用UNC(Universal Naming Convention )格式, \\Systemname或主机IP\ShareName\Path\FileName
  • DataFileType:数据编码{ 'char' | 'native' | 'widechar' | 'widenative' },widechar和widenative支持unicode

在Windows 批处理文件中用 osql 调用使用Bulk Insert 的SP,当然你也可以直接在在Sql Server Job 中调用。

Bcp Utility

执行环境:window 命令窗口或在batch文件中执行,有batch文件就可以用window计划或Control-M等工具调用。

语法详见:BCP Utility

功能特点:可以在数据文件与SQL Server之间导入、导出数据,也可以导出格式文件。

bcp [database_name.] schema.{table_name | view_name | "query" {in data_file | out data_file | queryout data_file | format nul}
  • in 导入数据到table
  • out 导出table 数据到文件
  • queryout 导出查询结果到文件
  • format nul 导出格式文件

使用举例:

使用时可能碰到各种报错,例如数据库连接不成功、文件路径不正确、表访问修改权限不够、格式文件不对或数据文件有问题等等

我在使用时采用以下思路:

  • 先用format nul 根据表导出格式文件
  • 使用out 导出数据文件
  • 在导出的数据文件基础上修改,制作新的数据文件
  • 使用in 和导出的格式文件导入数据

下面的命令使用“,”进行分割,可以使用csv文件,详细命令如下:

  • -S:server name
  • -T:SQL Server 信任模式,若不指定,则需用-U、-P指定数据库用户名,密码
  • -t :字段分隔符,默认是tab字符,-t,表示用逗号分隔
  • -c:表数据是字符型,以tab字符为字段分隔符,以\r\n为行分隔符
bcp instance.dbo.table format nul -S servername -f FormatFile.fmt -T -t, -c

bcp instance.dbo.table out c:\dataFile.csv -S servername -T -t, -c

bcp instance.dbo.table in dataFilePath -f formatFilePath -S serverName -T

对于格式文件,说明如下,图片来至MSDN

OpenRowSet

执行环境:SQL Server,属于Transact SQL, 可在查询窗口和存储过程中运行。

支持版本:从SQL Server2008开始支持

语法详见:MSDN Bulk Insert

功能特点:支持txt, csv等有分隔符分割数据的文件、excel、代替dblink从其他数据库(oracle 等)查询数据。

Provider String:

  • Jet引擎 :Microsoft.Jet.OLEDB.4.0

    • Jet 是 Joint Engine Technology
    • "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=MyUserID;Password=MyPassword;"
  • ODBC:MSDASQL
    • "Provider=MSDASQL;DSN=dsnName;UID=MyUserID;PWD=MyPassword;"
  • Oracel:MSDAORA
    • "Provider=MSDAORA;Data Source=serverName;User ID=MyUserID; Password=MyPassword;"

更多请见MSDN参考

使用举例:

下图面是从excel 2007中读取数据的例子,从指定的work sheet 中读取数据:

用代码从文件中导入数据到SQL Server的更多相关文章

  1. Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

    从Excel导入数据到Sql server 时,由于表中的数据有的很长,导入时出现如下错误(如果数据不是很长,255内以内,则不会出现错误): 出错原因: SQL Server的导入导出为了确定数据表 ...

  2. SQLite从Excel文件中导入数据

    元数据 另存为.csv格式 用记事本打开 打开后的数据 Android客户端开发的时候使用了SQLite数据库,为了测试,需要将一些excel文件中的数据导入到数据库的表中,下面是几个步骤: 数据库表 ...

  3. EXCEL导入数据到SQL SERVER 2008

    项目中需要导入excel到SQL SERVER数据库 总是报截断, 本质问题是,SQL SERVER导入程序是根据EXCEL的第一行记录 (非标题行)来决定数据长度的 碰到这个问题,可以伪造第一行,然 ...

  4. Kettle从excel导入数据到sql server

    从excel工作表中读取数据逐行执行insert语句插入到sqlserver 为了简单起见只选取了三个个字段作为参数,日期,字符类型的需要加上'' Spoon是作业配置的GUI界面,配置好后可以通过控 ...

  5. python从Microsoft Excel文件中导入数据

    excel中后缀为csv和xls,二者区别如下:1.xls 文件就是Microsoft excel电子表格的文件格式.2.csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中. ...

  6. 向EXECL文件中导入数据的同时插入图片

    因为项目需要在导出数据到EXECL文档的同时还需要导出图片进去,在处理是遇到的一些问题,在此记录一下. 首先代码写好之后放测试服务器上去执行的时候报错了,报检索 COM 类工厂中 CLSID 为 {0 ...

  7. MySQL mysqlimport 从txt文件中导入数据到mysql数据库

    mysqlimport: 我说这个我们还是先从世界观方法论的高度来理解一下便有更加准确的把握.数据导入不外呼有两个部分 第一部分:目标对象--我们要把数据导给谁(mysqlimport 的目标对象自然 ...

  8. 使用跨平台图表控件TeeChart如何从DAT或TEXT文件中导入数据

    大多数开发人员在使用TeeChart进行开发的时候,都需要访问包含在文本文档中的一些数据,本次教程将详细讲解如何去实现这一步骤. 文本文件通常包含使用空格键或者是TAB键分隔开的数字和文字: TeeC ...

  9. 使用xlrd模块从excel文件中导入数据

随机推荐

  1. 评论alpha发布以及PSP

    讲解顺序: 1.  俄罗斯方块   武志远 俄罗斯方块有自己新颖的玩法加在里面 ,可以进行游戏,界面友好但不美观,与传统玩法相比增加了经验值,这是一个很好的创意,游戏运行也很流畅,并找到两名同学现场体 ...

  2. python3.6执行AES加密及解密方法

    python版本:3.6.2 首先安装pycryptodome cmd执行命令:pip install pycryptodome 特别简单,代码如下: #!/usr/bin/python # -*- ...

  3. windows多线程(十) 生产者与消费者问题

    一.概述 生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池 ...

  4. 12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  5. 深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程

    Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内 ...

  6. Make a Crystal UVA - 11014 (容斥定理)

    题意:给定一个NxNxN的正方体,求出最多能选几个整数点,使得任意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O),那么所 ...

  7. MT【123】利用第一次的技巧

    已知 \(r_1=0,r_{100}=0.85,(r_k\) 表示投 k 次投中的概率.) 求证:(1)是否存在\(n_0\)使得\(r_{n_0}=0.5\) (2)是否存在\(n_1\)使得\(r ...

  8. Virtual Table

    C++对象模型——吴泰 C/C++杂记 C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 C++ 多继承和虚继承的内存布局 [已翻译100%] (虚继承参考,推荐) 图说C++对象模型:对 ...

  9. [洛谷P4723]【模板】线性递推

    题目大意:求一个满足$k$阶齐次线性递推数列$a_i$的第$n$项. 即:$a_n=\sum\limits_{i=1}^{k}f_i \times a_{n-i}$ 题解:线性齐次递推,先见洛谷题解, ...

  10. BZOJ2079 [Poi2010]Guilds 【贪心】

    题目链接 BZOJ2079 题解 题意就是黑白染色,要求相邻点存在不同颜色的点 显然从一个点出发,相邻点如果没有染色,染不同颜色,那么一个联通块一定会满足要求 证明:在\(dfs\)树上,每个点父亲和 ...