这个存储过程自动创建表并从文件加载数据。

有一点需要说明的是Excel 12.0驱动是兼容了Excel 97-2003和Excel 2007两者格式的Excel文件。

CREATE PROCEDURE [dbo].[LoadDataFromFileIntoXXXXDB]
@FilePath NVARCHAR(4000), --Ex. D:\test.xls
@SheetName NVARCHAR(4000), --Ex. Sheet1
@FileType NVARCHAR(50), --Ex. Excel
@TargetTableSchema SYSNAME, --Ex. dbo
@TargetTableName SYSNAME --Ex. MyTable
AS
SET NOCOUNT ON DECLARE @msg NVARCHAR(4000) IF ISNULL(@FilePath,'') = ''
RAISERROR('@FilePath can not be empty',16,1) IF ISNULL(@SheetName,'') = ''
RAISERROR('@SheetName can not be empty',16,1) IF NOT EXISTS(SELECT * FROM [XXXX].sys.schemas WHERE name = @TargetTableSchema)
BEGIN
SET @msg = REPLACE('Schema @TargetTableSchema can not be found','@TargetTableSchema',@TargetTableSchema)
RAISERROR(@msg,16,1)
RETURN
END DECLARE @cmd NVARCHAR(MAX)
SET @cmd = '
IF OBJECT_ID(''[XXXX].['+@TargetTableSchema+'].['+@TargetTableName+']'') IS NOT NULL
DROP TABLE [XXXX].['+@TargetTableSchema+'].['+@TargetTableName+']' EXEC(@cmd) IF @FileType = 'Excel'
BEGIN
SET @cmd = '
SELECT * INTO [XXXX].['+@TargetTableSchema+'].[' + @TargetTableName + ']
FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'' 
,''Excel 12.0 Xml;HDR=YES;IMEX=1;Database='+@FilePath+'''
,''SELECT * FROM ['+@SheetName+'$]'');
'
END --PRINT(@cmd)
EXEC (@cmd) SET NOCOUNT OFF

------------------------------------- updated 2015/12/09 ------------------------------------

上方代码的OPENROWSET加入了“IMEX=1”。IMEX选项的意思是import mode。0代表Export Mode,1代表import mode,2代表linked mode。默认是0。这种模式下OLEDB根据文件字段靠前的行的类型确认数据类型,这样就会出现数据丢失的情况。假设说前10行中Field1都是123456,第11行是123,456,可是第12行出现了“   123,456 ”。(注意下第12行的这个值其实前后不是空格,如果尝试在SQL Server里面用T-SQL函数ASCII转成ASCII码,你会发现其实不是空格,但是这种字符容易在文件内容为用户手工编辑,尤其是用户电脑是中文版的情况下,因为用户很可能使用中文输入法。)。

如果默认IMEX=0,则上面的结果是第11行成功被隐式转换成了123456(整型),第12行变为NULL。为了避免这种风险,把IMEX设置为1,这样每次数据加载就可以避免数据丢失的情况,因为所有的数据都被当成字符串对待。至于IMEX=2是什么?没去了解。

参考文献:

Mixed data types in Excel column

SQL Server ->> 自动创建表并从文件加载数据的更多相关文章

  1. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

  2. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  3. (4.21)SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    转自:指尖流淌 http://www.cnblogs.com/zhijianliutang/p/4100103.html SQL Server数据库启动过程(用户数据库加载过程的疑难杂症) 前言 本篇 ...

  4. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  5. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  6. SQL server数据库创建代码,filegroup文件组修改,

    以下示例在 SQL Server 实例上创建了一个数据库.该数据库包括一个主数据文件.一个用户定义文件组和一个日志文件.主数据文件在主文件组中,而用户定义文件组包含两个次要数据文件.ALTER DAT ...

  7. sql server查看创建表的代码,表定义

    1.查看建表语句在“对象资源管理器”中找到要导出的表,选中该表并单击右键,“编写表脚本为(S)”/“CREATE到(C)”/“新查询编辑器窗口”即可查看该表的建表语句.2.导出建表语句在“对象资源管理 ...

  8. SQL Server 动态创建表结构

    需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...

  9. 使用Spark加载数据到SQL Server列存储表

    原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...

随机推荐

  1. centsos 查看系统版本信息

    [root@hostuser gitlab]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cx ...

  2. 用matplotlib绘制图像

    实例一: import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*n ...

  3. Java正则表达式-匹配正负浮点数

    记录缘由: 公司项目需要从xml中获取标识为NUMBER的字符串,将之存入数据库中,存入的列的类型即为NUMBER.当遇到非数字时,原实现是通过异常: String plainValue = null ...

  4. 自己用的opensuse源

    utsc_oss               http://mirrors.ustc.edu.cn/opensuse/distribution/13.1/repo/oss/utsc_non_oss  ...

  5. 【javascript】jq之display:none与visible:hidden

    今天学习到jquery的hide()部分时,突然有一个想法,jquery中的隐藏/显示部分的实现是给目标元素附加一个"display: none"属性,那么如果在类似于下面的布局中 ...

  6. 【ExtJS】 布局Layout

    布局用于定义容器如何组织内部子元素和控制子元素的大小. ExtJS中有两种类型的布局:Container容器类布局与Component组件类布局. Containter容器类布局:负责容器内容Extj ...

  7. 关于定位和z-index的一些小经历

    今天在工作过程中,遇到这么一个奇葩问题,搞了好一阵子才找到原因,遂总结了一下... 先上DEMO: <div style="width:800px; height:400px;&quo ...

  8. html中 alt 和 title 的区别

    alt 用来给图片来提示的(图片载入失败时以文本形式提示). Title用来给链接文字或普通文字提示的(在鼠标放上去的时候就会提示).

  9. java.lang.NumberFormatException: For input string: "1" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang

    java.lang.NumberFormatException: For input string: "1" at java.lang.NumberFormatException ...

  10. 【转】C++和Java比较

    "作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的.事实上,Java本来就是从C++衍生出来的." 然而,C++和Java之间仍存 ...