IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]-------------------EXCEL按照格式循环批量导入数据库(续)-----------------------------------------

    fredrickhu发表于 2013-11-22 11:23:37
    love 0
    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栏位以下的数据:



沪ICP备19023445号-2号
友情链接