您的位置:首页 > 数据库

-------------------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栏位以下的数据:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: