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

有一点需要说明的是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. Java 覆写初探

    Java 覆写 继承性的主要特征是子类可以根据父类已有的功能进行功能扩展,但是在子类定义属性或方法的时候有可能定义属性和方法和父类同名,在此类情况下就称为:“覆写”. 方法的覆写:[改良原本功能不足的 ...

  2. Python+Selenium之常用模块

    要用webdriver:from selenium import webdriver eg: driver = webdriver.Chrome()      driver.maximize_wind ...

  3. 使用maven构建多模块项目_记录

    参照孤傲苍狼的博客:https://www.cnblogs.com/xdp-gacl/p/4242221.html 备注:博客中的生成语句,适用于maven3.0.5以上,若为3.0.5以下,则将cr ...

  4. (转)haproxy启动故障:Starting proxy:cannot bind socke

    haproxy启动时提示失败: [ALERT] 164/110030 (11606) : Starting proxy linuxyw.com: cannot bind socket 这个问题,其实就 ...

  5. bug缺陷级别定义

    缺陷定义: 出现以下缺陷测试定义为致命 bug l  系统无响应处于死机状态. l  点击某个菜单后出现“The page cannot be displayed”或者返回异常错误. l  进行某 ...

  6. css3中比较少用到的属性记录

    letter-spacing 属性 支持:所有浏览器都支持 letter-spacing 属性. letter-spacing 属性增加或减少字符间的空白(字符间距). 该属性定义了在文本字符框之间插 ...

  7. orcale 之 SQL 数据查询

    从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列.虽然 SELECT 语句的完整语法较复杂,但是其主要的子句可归纳如下: SELECT select_list [ INTO new_tab ...

  8. Java中子类覆盖父类方法所必须满足的条件

    因为太喜欢,所以转来,侵删! 参考自:http://www.it165.net/pro/html/201504/39284.html 一.描述 子类重写(覆盖)父类的方法必须满足的条件:1.父类中的方 ...

  9. Firebird Case-Insensitive Searching 大小写不敏感查找

    Firebird 默认是大小写敏感,在检索的时候. 要想不敏感检索,两种方法: 1.where upper(name) = upper(:flt_name) 2.检索时指定字符集collation,例 ...

  10. Tomcat配置连接池的java实现

    1.准备 JNDI(Java Naming and Directory Interface),Java命名和目录接口.JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源.我们这 ...