首页 > 数据库技术 > 详细

SQL Server ->> 自动创建表并从文件加载数据

时间:2015-12-09 11:33:31      阅读:171      评论:0      收藏:0      [点我收藏+]

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

有一点需要说明的是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 ->> 自动创建表并从文件加载数据

原文:http://www.cnblogs.com/jenrrychen/p/4971671.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!