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

有一点需要说明的是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. Partition Array by Odd and Even

    Partition an integers array into odd number first and even number second. Example Given [, , , ], , ...

  2. Junit参数化

    数据驱动测试:测试代码要与测试数据分离 哎~~学习时发现一个问题,写完了测试文件,右击文件时没有run as ->junit test的选项,找了好半天,终于知道了原因,是方法前没有加stati ...

  3. 封装你的协程Unity TaskManager

    unity5提供了协程,不过用起来很蛋疼,当然如果是unity2017 你就可以用async await了 提供一个TaskManager来封装协程(github  https://github.co ...

  4. 在windows服务器上设置301、伪静态(wordpress)

    新建一个httpd.ini文件,插入代码: [ISAPI_Rewrite] RewriteCond Host: ^wuchao\.cc$ RewriteRule (.*) http\://www\.w ...

  5. Intellij IDEA自定义类模板和方法模板

    以Intellij IDEA 2017.3.5为例 定义类模板 依次打开File->Settings->File and Code Templates->Files, 选择class ...

  6. Golang教程:结构体

    结构体(struct)是用户自定义的类型,它代表若干字段的集合.有些时候将多个数据看做一个整体要比单独使用这些数据更有意义,这种情况下就适合使用结构体. 比如将一个员工的 firstName, las ...

  7. 架构实战项目心得(四):使用Nexus配置Maven私有仓库

    一.安装配置Nexus 1.  下载nexus https://www.sonatype.com/download-oss-sonatype 2.  解压:tar -zxfnexus-3.5.2-01 ...

  8. Splunk数据处理

    0.提要 本篇主要从技术层面针对Splunk Enterprise中关于数据处理的概念.过程与部件进行了概要性总结. 1.数据管理基本概念 索引(index):Splunk用于存储事件的数据仓库: 索 ...

  9. IEnumerable Except

    // // 摘要: // 通过使用默认的相等比较器对值进行比较生成两个序列的差集. // // 参数: // first: // 一个 System.Collections.Generic.IEnum ...

  10. 登陆oracle数据库时提示“ORA-28002: 7 天之后口令将过期” 或提示 密码过期

    登陆oracle数据库时提示“ORA-28002: 7 天之后口令将过期” 或提示 密码过期. [原因/触发因素] 确定是由于oracle11g中默认在default概要文件中设置了“PASSWORD ...