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