Sql Server通过BCP数据导出Excel

1.1. bcp的主要参数介绍

bcp共有四个动作可以选择。
(1) 导入。
这个动作使用in命令完成,后面跟需要导入的文件名。
(2) 导出。
这个动作使用out命令完成,后面跟需要导出的文件名。
(3) 使用SQL语句导出。
这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。
(4) 导出格式文件。
这个动作使用format命令完成,后而跟格式文件名。
下面介绍一些常用的选项:
-f format_file
format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。
-x
这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。
-F first_row
指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。
-L last_row
指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。
-c
使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。
-w
和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。
-t field_term
指定字符分割符,默认是"\t"。
-r row_term
指定行分割符,默认是"\n"。
-S server_name[ \instance_name]
指定要连接的SQL Server服务器的实例,如果未指定此选项,bcp连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。
-U login_id
指定连接SQL Sever的用户名。
-P password
指定连接SQL Server的用户名密码。
-T
指定bcp使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。
-k
 
2.SQL

 -- 这里是创建一个临时表
                    SELECT  *
                    INTO    TempCOrder
                    FROM    ( SELECT    '账号' a , '签约银行' b ,'子账号' c , '类型' d , '金额' e ,  '出入时间' f   --这里是因为导出的时候Excel表没有列,这里采用union all为表增加一个列标题
                              UNION ALL
                              SELECT    u.userName ,
                                        CASE c.ConBankType
                                          WHEN '2' THEN '农业银行'
                                          WHEN '1' THEN '华夏银行'
                                        END back ,
                                        c.subuser ,
                                        CASE f.reason
                                          WHEN '3' THEN '库存结算'
                                          WHEN '4' THEN '银行入金'
                                          WHEN '5' THEN '银行出金'
                                          WHEN '6' THEN '手工调账'
                                        END reason ,
                                        CONVERT(VARCHAR(24), f.changevalue) ,
                                        CONVERT(VARCHAR(24), f.opertime, 121)
                              FROM      dbo.Fund_Change f
                                        INNER JOIN dbo.Trade_User u ON f.userId = u.userId
                                        INNER JOIN dbo.Trade_FundInfo c ON f.userId = c.userId
                              WHERE     u.[state] = '1'
                                        AND c.[state] = '2'
                                        AND f.opertime BETWEEN @BeginDate
                                                       AND    @EndDate
                                                              + @AgentId
                                        AND f.reason IN ( '3', '4', '5', '6' )
                              UNION ALL  --数据查询
                              SELECT    '总计:' ,
                                        '' ,
                                        '' ,
                                        '' ,
                                        CONVERT(VARCHAR(24), SUM(f.changevalue)) changevalue ,
                                        ''
                              FROM      dbo.Fund_Change f
                                        INNER JOIN dbo.Trade_User u ON f.userId = u.userId
                                        INNER JOIN dbo.Trade_FundInfo c ON f.userId = c.userId
                              WHERE     u.[state] = '1'
                                        AND c.[state] = '2'
                                        AND f.opertime BETWEEN @BeginDate
                                                       AND    @EndDate
                                                              + @AgentId
                                        AND f.reason IN ( '3', '4', '5', '6' ) --为表最后增加一个合计
                            ) a      

--3.用BCP命令导出到指定的文件夹下                 
                    SET @sqlCmd = 'bcp JinTong_JYRJ.dbo.TempCOrder  out F:\' + @ReportFile + ' -c -U"jintongjy" -P"jtjiaoyirj!"' ;
                    EXEC master..xp_cmdshell @sqlCmd ;
                    IF EXISTS ( SELECT  *
                                FROM    sys.tables
                                WHERE   name = 'TempCOrder' )
                        DROP TABLE TempCOrder ;
                    SET @Result = '资金变动报表查询成功' ;
                    RETURN 0 ;
                END TRY
                BEGIN CATCH
                    SET @Result = '资金变动报表查询失败' ;
                    IF EXISTS ( SELECT  *
                                FROM    sys.tables
                                WHERE   name = 'TempCOrder' )
                        DROP TABLE TempCOrder ;
                    RETURN 1 ;                   
                END CATCH  
            END

posted @ 2013-08-22 15:43  ypa  阅读(870)  评论(0编辑  收藏  举报