Export table to Excel file

USE [WorkSpace]

GO

/****** Object:  StoredProcedure [dbo].[usp_export_table]    Script. Date: 12/02/200911:43:36 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:    Larry Song

-- Create date: 2009-12-02

-- Description:   Export data from table to excel file

-- =============================================

 

/*-- EXAMPLE:

 

 EXEC [dbo].[usp_export_table]

    @sys_tb_name='tb_name',

    @nvc_folder='c:\',

    @nvc_file_name='test.xls',

    @nvc_sheet_name='sheet_name'

--*/

ALTER PROCEDURE [dbo].[usp_export_table]

    @sys_tb_name      SYSNAME,          -- table name which needs to be exported

    @nvc_folder          NVARCHAR(4000),      -- the folder of the exported excel file

    @nvc_file_name       NVARCHAR(255)='', -- excel file name, default is table name

    @nvc_sheet_name      NVARCHAR(255)=''  -- sheet name, default is file name

AS

BEGIN

    DECLARE @nvc_err INT,@nvc_src NVARCHAR(255),@nvc_desc NVARCHAR(255),@OUT INT,@nvc_del NVARCHAR(255),@int_flag INT

    DECLARE @nvc_obj INT,@nvc_constr NVARCHAR(4000),@nvc_sql NVARCHAR(4000),@nvc_field_list NVARCHAR(4000)

   

    BEGIN TRY

       --BEGIN TRANSACTION

 

           -- Check Parameters

           IF RIGHT(@nvc_folder,   1) <> '\' 

           BEGIN

                SET @nvc_folder = @nvc_folder + '\' 

           END

           IF ISNULL (@nvc_file_name,'')=''

              SET @nvc_file_name=@sys_tb_name+'.xls'

           IF ISNULL (@nvc_sheet_name,'')=''

              SET @nvc_sheet_name=REPLACE (@nvc_file_name,'.','#')

      

      

           -- Whether the file exists or not?

      

           CREATE TABLE #tb(a BIT,b BIT,c BIT)

           SET @nvc_sql=@nvc_folder+@nvc_file_name

           --  del the file

       /*  EXECUTE   master..xp_fileexist   @nvc_sql,   @int_flag   OUTPUT  

           IF @int_flag <> 0

           BEGIN

              SET @nvc_del = 'del ' + @nvc_sql

              EXEC xp_cmdshell @nvc_del

           END

       */  INSERT INTO #tb EXEC master..xp_fileexist @nvc_sql

      

           -- Create the DB

           SET @nvc_sql=@nvc_folder+@nvc_file_name

           IF EXISTS(SELECT 1 FROM #tb WHERE a=1)

           BEGIN

            SET @nvc_constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'

                 +';CREATE_DB="'+@nvc_sql+'";DBQ='+@nvc_sql

           END

           ELSE

           BEGIN

            SET @nvc_constr='Provider=Microsoft.Jet.OLEDB.4.0;EXTENDED Properties="Excel 5.0;HDR=YES'

              +';DATABASE='+@nvc_sql+'"'

           END

      

           -- Connect to DB

           EXEC @nvc_err=sp_OACREATE 'adodb.connection',@nvc_obj OUT

           IF @nvc_err<>0

              GOTO err_section

      

           EXEC @nvc_err=sp_OAMethod @nvc_obj,'open',null,@nvc_constr

           IF @nvc_err<>0

              GOTO err_section

      

           -- Create the table in EXCEL file

           SELECT @nvc_sql='',@nvc_field_list=''

      

           SELECT @nvc_field_list=@nvc_field_list+',['+a.name+']'

            ,@nvc_sql=@nvc_sql+',['+a.name+'] '

             +CASE

              WHEN b.name LIKE '%CHAR'

              THEN CASE WHEN a.length>255 OR a.length < 0 THEN 'MEMO'

              ELSE 'TEXT('+CAST(a.length AS varCHAR)+')' END

              WHEN b.name LIKE '%INT' or b.name='BIT' THEN 'INT'

              WHEN b.name LIKE '%DATETIME' THEN 'DATETIME'

              WHEN b.name LIKE '%MONEY' THEN 'MONEY'

              WHEN b.name LIKE '%TEXT' THEN 'MEMO'

              ELSE b.name END

           FROM syscolumns a LEFT JOIN systypes b

           ON a.xtype=b.xusertype

           WHERE b.name NOT IN('image','uniqueidentIFier','sql_variant','varbinary','binary','timestamp')

            AND OBJECT_ID(@sys_tb_name)=id

      

           SELECT @nvc_sql='CREATE TABLE ['+@nvc_sheet_name

            +']('+SUBSTRING(@nvc_sql,2,8000)+')'

            ,@nvc_field_list=SUBSTRING(@nvc_field_list,2,8000)

      

           EXEC @nvc_err=sp_oamethod @nvc_obj,'EXECUTE',@OUT OUT,@nvc_sql

           IF @nvc_err<>0

              GOTO err_section

             

           EXEC @nvc_err=sp_oamethod @nvc_obj,'Close'

           IF @nvc_err<>0

              GOTO err_section

      

           EXEC @nvc_err=sp_oadestroy @nvc_obj

      

           -- Export the data to EXCEL file

           SET @nvc_sql='OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;

              ;DATABASE='+@nvc_folder+@nvc_file_name+''',['+@nvc_sheet_name+'$])'

      

           EXEC('INSERT INTO '+@nvc_sql+'('+@nvc_field_list+') SELECT '+@nvc_field_list+' FROM '+@sys_tb_name)

      

           return

      

           err_section:

            EXEC sp_oageterrorinfo 0,@nvc_src OUT,@nvc_desc OUT

           exit_section:

            SELECT CAST(@nvc_err AS varbinary(4)) AS 'ErrorNum'

             ,@nvc_src AS 'ErrorSource',@nvc_desc AS 'ErrorDesc'

            SELECT @nvc_sql,@nvc_constr,@nvc_field_list

       --COMMIT TRANSACTION

    END TRY

 

    BEGIN CATCH

       EXEC usp_error_handler '[usp_export_table]'

    END CATCH

 

END

 

需要注意的几点:

1 ''MICROSOFT.JET.OLEDB.4.0''不支持事务,因此不能在事务中使用!

sp_oamethod 的使用,在调用sp_oadestroy 之前,先需要将 sp_oamethod  Close,否则资源将不会释放,造成操作失败!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/518079/viewspace-660423/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/518079/viewspace-660423/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值