用代码从文件中导入数据到SQL Server
引言
导入数据到SQL Server 是常见的需求,特别是定期导入这种需求。
对于定期导入主要有以下几种方式可选择:
- Bulk Insert
- Bcp Utility
- OpenRowSet
- 写程序导入(使用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的更多相关文章
- Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”
从Excel导入数据到Sql server 时,由于表中的数据有的很长,导入时出现如下错误(如果数据不是很长,255内以内,则不会出现错误): 出错原因: SQL Server的导入导出为了确定数据表 ...
- SQLite从Excel文件中导入数据
元数据 另存为.csv格式 用记事本打开 打开后的数据 Android客户端开发的时候使用了SQLite数据库,为了测试,需要将一些excel文件中的数据导入到数据库的表中,下面是几个步骤: 数据库表 ...
- EXCEL导入数据到SQL SERVER 2008
项目中需要导入excel到SQL SERVER数据库 总是报截断, 本质问题是,SQL SERVER导入程序是根据EXCEL的第一行记录 (非标题行)来决定数据长度的 碰到这个问题,可以伪造第一行,然 ...
- Kettle从excel导入数据到sql server
从excel工作表中读取数据逐行执行insert语句插入到sqlserver 为了简单起见只选取了三个个字段作为参数,日期,字符类型的需要加上'' Spoon是作业配置的GUI界面,配置好后可以通过控 ...
- python从Microsoft Excel文件中导入数据
excel中后缀为csv和xls,二者区别如下:1.xls 文件就是Microsoft excel电子表格的文件格式.2.csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中. ...
- 向EXECL文件中导入数据的同时插入图片
因为项目需要在导出数据到EXECL文档的同时还需要导出图片进去,在处理是遇到的一些问题,在此记录一下. 首先代码写好之后放测试服务器上去执行的时候报错了,报检索 COM 类工厂中 CLSID 为 {0 ...
- MySQL mysqlimport 从txt文件中导入数据到mysql数据库
mysqlimport: 我说这个我们还是先从世界观方法论的高度来理解一下便有更加准确的把握.数据导入不外呼有两个部分 第一部分:目标对象--我们要把数据导给谁(mysqlimport 的目标对象自然 ...
- 使用跨平台图表控件TeeChart如何从DAT或TEXT文件中导入数据
大多数开发人员在使用TeeChart进行开发的时候,都需要访问包含在文本文档中的一些数据,本次教程将详细讲解如何去实现这一步骤. 文本文件通常包含使用空格键或者是TAB键分隔开的数字和文字: TeeC ...
- 使用xlrd模块从excel文件中导入数据
随机推荐
- Go 自学笔记
1. 最近花时间简单自学了一下go语言的语法..为了保证自己不是每次从0 开始 这次简单进行一下记录 保证 学习 效果. 2. 安装 直接下载go的包 进行安装 以及 暗转goland2018.3 进 ...
- java static{}块
java中static{}块只有在类加载是才会被调用. 这说明:static只有可能被调用一次. 原因:首先理解什么是类加载,区分类加载和申明对象的区别. public class StaticTes ...
- [Offer收割]编程练习赛23-freeloop
A. H国的身份证号码I dfs裸题. 时间复杂度\(O(n^k)\). #include <bits/stdc++.h> #define FOR(i,a,b) for (int i=a; ...
- jenkins自动部署windwos服务器
jenkins 持续构建windows 项目 需求说明 公司新购windwos服务器,并配置了堡垒机,由于经常要提交代码进行更新,导致手动部署很是麻烦,故采用公司jenkins实行持续构建 jenki ...
- HEOI2015小L的白日梦
题面链接 洛咕 sol 为什么网上面只有神仙题解啊!!! 引起我这种蒟蒻不适QAQ. 性质证明留给巨佬 然后我只贴性质了QwQ. 1.一定存在最优解每一天不高兴的概率是单调不增的. 2.一定存在最优解 ...
- 用Python实现的数据结构与算法:基本搜索
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分 ...
- ICMP类型和代号对照表
ICMP类型 TYPE CODE Description Query Error 0 0 Echo Reply——回显应答(Ping应答) x 3 0 Network Unreachable——网 ...
- 【Asp.net入门3-03】jQuery-选择元素
练习:使用jQuery实现一个可以给table增加.删除行的页面 HTML代码: <body> <input type="button" value=" ...
- Python操作sqlserver 2000
在网上找到了pyodbc这个模块,本人操作系统是 Ubuntu 16.04 , Python 2.7 已经安装了pip 按照 官方文档 的步骤成功安装. 但是需要跨平台. 使用pyodbc在wind ...
- 发现视口(窗口)自适应的新大陆!!vw、vh
从事前端已经1年了,一直为背景自适应铺满整个屏幕而苦苦发愁,因为要适配不同的pc显示器,所以高度不能写死,但是写(height:100%)并不能实现,愁死我了~我要不用写好的css框架实现或者自己写j ...