-------------------EXCEL按照格式循环批量导入数据库(续)-----------------------------------------
2013-11-22 11:23
447 查看
IF OBJECT_ID('TB')IS NOT NULL DROP TABLE TB GO CREATE TABLE TB ( ARRIVALAIRPORT NVARCHAR(4000), [MCTTIME] NVARCHAR(4000), MCTSTATUS NVARCHAR(4000), DEPARTUREAIRPORT NVARCHAR(4000), ARRIVALAIRLINE NVARCHAR(4000), INCOMINGFLIGHT NVARCHAR(4000), DEPARTUREAIRLINE NVARCHAR(4000), OUTGOINGFLIGHT NVARCHAR(4000), ARRIVALTERMINAL NVARCHAR(4000), DEPARTURETERMINAL NVARCHAR(4000), PREVIOUSCOUNTRY NVARCHAR(4000), PREVIOUSCITY NVARCHAR(4000), PREVIOUSAIRPORT NVARCHAR(4000), NEXTCOUNTRY NVARCHAR(4000), NEXTCITY NVARCHAR(4000), NEXTAIRPORT NVARCHAR(4000), EFFECTIVEFROM NVARCHAR(4000), EFFECTIVETO NVARCHAR(4000) ) IF OBJECT_ID('P_EXCELFILETODATA') IS NOT NULL DROP PROC P_EXCELFILETODATA GO CREATE PROC P_EXCELFILETODATA ( @PATH SYSNAME, --完全路径名 @FILTER SYSNAME='*.XLSX'--默认导EXCEL2007的 ) AS --@PATH 完全路径名(D:\XXXX\) --@FILTER 筛选的文件名选项以及文件类型(合并一起输入) SET NOCOUNT ON DECLARE @S NVARCHAR(4000),@SQL NVARCHAR(4000),@I INT--,@PATH NVARCHAR(4000),@FILTER SYSNAME SET @I=1 SET @S='DIR '+@PATH+@FILTER+'/B' CREATE TABLE #FILE(FLNAME SYSNAME NULL) INSERT INTO #FILE EXEC MASTER..XP_CMDSHELL @S DECLARE @FILE SYSNAME,@SHEETNAME SYSNAME,@SHEETLIKENAME SYSNAME,@COLUMNNAME SYSNAME DECLARE CUR_FILENAME CURSOR FOR SELECT * FROM #FILE WHERE [FLNAME] IS NOT NULL AND [FLNAME]<>'找不到文件' OPEN CUR_FILENAME FETCH NEXT FROM CUR_FILENAME INTO @FILE WHILE @@FETCH_STATUS=0 BEGIN SET @SHEETNAME=LEFT(@FILE,CHARINDEX('.',@FILE)-1) SET @SHEETLIKENAME=SUBSTRING(@SHEETNAME,5,LEN(@SHEETNAME)) --PRINT @SHEETNAME SELECT @SQL = ISNULL(@SQL,'')+ 'SELECT * INTO TB'+ LTRIM(@I) +' FROM OPENROWSET( ''MICROSOFT.ACE.OLEDB.12.0'', ''EXCEL 12.0;HDR=NO;IMEX=1;DATABASE='+@PATH+@FILE+''',''SELECT * FROM ['+@SHEETNAME+'$]'') ' FETCH NEXT FROM CUR_FILENAME INTO @FILE SET @I=@I+1 END EXEC(@SQL) CLOSE CUR_FILENAME DEALLOCATE CUR_FILENAME GO --测试 EXEC P_EXCELFILETODATA 'D:\ExcelFiles\','*.XLSX' GO IF OBJECT_ID('TEMPDB..#VALUE_COLNAME') IS NOT NULL DROP TABLE #VALUE_COLNAME GO CREATE TABLE #VALUE_COLNAME(ID INT ,VALUE NVARCHAR(4000),COLNAME NVARCHAR(8)) DECLARE @I INT,@J NVARCHAR(10) SET @I=1 SET @J='TB1' WHILE @I<=(SELECT COUNT(NAME) FROM SYSOBJECTS WHERE TYPE='U' AND NAME LIKE '%TB%' AND NAME<>'TB') BEGIN --拼接值列,列转行. DECLARE @S1 NVARCHAR(MAX) SELECT @S1=ISNULL(@S1+CHAR(10)+' UNION ALL '+CHAR(10)+'SELECT ','') +'ID='+LTRIM(@I)+',LTRIM(RTRIM(CONVERT(NVARCHAR(MAX),A.'+NAME+')))+LTRIM(RTRIM(CONVERT(NVARCHAR(MAX),B.'+NAME+'))) AS VALUE, '''+NAME+''' AS COLNAME FROM '+@J+' A,'+@J+' B WHERE LTRIM(RTRIM(CONVERT(NVARCHAR(MAX),A.F1)))=''Arrival'' AND LTRIM(RTRIM(CONVERT(NVARCHAR(MAX),B.F1)))=''Airport'' ' FROM TEMPDB.DBO.SYSCOLUMNS WHERE ID=OBJECT_ID('TEMPDB..'+@J+'') AND NAME <>'ID' ORDER BY COLID --EXEC('SELECT '+@S1) INSERT INTO #VALUE_COLNAME EXEC('SELECT '+@S1) --SELECT * FROM #VALUE_COLNAME WHERE id=2 --PRINT @I --拼接列对应 DECLARE @TB_COLNAME NVARCHAR(MAX),@EXCEL_COLNAME NVARCHAR(MAX) SET @TB_COLNAME='' SET @EXCEL_COLNAME='' SELECT @TB_COLNAME=ISNULL(@TB_COLNAME+',','')+S.NAME, @EXCEL_COLNAME=ISNULL(@EXCEL_COLNAME+',','')+ISNULL(V.COLNAME,'''''') --s.name,v.[COLNAME] FROM SYSCOLUMNS S LEFT JOIN #VALUE_COLNAME V ON S.NAME=V.VALUE WHERE S.ID=OBJECT_ID('TB') AND V.ID=@I ORDER BY S.COLID SET @TB_COLNAME=RIGHT(@TB_COLNAME,LEN(@TB_COLNAME)-1) SET @EXCEL_COLNAME=RIGHT(@EXCEL_COLNAME,LEN(@EXCEL_COLNAME)-1) --插入数据 --PRINT 1 EXEC('INSERT INTO TB('+@TB_COLNAME+') SELECT '+@EXCEL_COLNAME+' FROM ' +@J+ ' WHERE LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(MAX),F1))))=3') SET @I=@I+1 SET @J='TB'+LTRIM(@I) END
下面的图片是EXCEL的格式: 要求批量导入这样的EXCEL,全部存放在一个文件夹中。导入每个EXCEL里面的Arrival栏位以下的数据:
相关文章推荐
- 转载Code First Migrations更新数据库架构的具体步骤
- SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?
- 九 redis学习笔记之虚拟内存
- 八 redis学习笔记之主从复制
- oracle:os认证用户登录测试
- 六 redis学习笔记之发布订阅
- 五 redis学习笔记之pipeline
- 四 redis学习笔记之事务
- 强大的数据库查询工具Database.NET 9.4.5018.42
- 三 redis学习笔记之排序
- 二 redis学习笔记之数据类型
- Sqlserver获取自增长id
- 一、redis学习笔记之环境搭建
- MongoDB的主要特性概述
- sql存储过程分页
- 七redis学习笔记之持久化
- ORACLE创建管理索引
- mysql远程访问\大小写\密码验证
- 在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)
- 在论坛中出现的比较难的sql问题:15(行转列2)