如何从另一个存储过程执行一个存储过程并将结果保存为CSV文件

时间:2015-05-21 06:31:20

标签: sql-server stored-procedures export-to-csv sql-server-2014

我有一个存储过程,它从连接表中提供了一些数据。

有些时候,客户希望我们以CSV格式导出这些数据,这些数据可以通过打开excel文件轻松管理。

所以我想创建另一个程序,它将调用给定的存储过程并将其保存为CSV文件。

1 个答案:

答案 0 :(得分:1)

让我们开始吧。

这是我们的第一个存储过程

CREATE PROCEDURE [dbo].[stpCOUNTRIES]

AS

BEGIN  
    BEGIN TRY 
        SELECT  NAMES,CODES FROM COUNTRIES 

    END TRY

    -- ---------------------------------
    -- ERROR HANDLING
    -- ---------------------------------
    BEGIN CATCH
        Declare @ErrMsg   nvarchar(200) = ERROR_MESSAGE(),
                @ErrLine  int = ERROR_LINE(),
                @ErrNum   int = ERROR_NUMBER(),
                @ErrSev   int = ERROR_SEVERITY(),
                @ErrState int = ERROR_STATE(),
                @ErrProc  sysname = ERROR_PROCEDURE();
        RAISERROR('ERROR in [%s] Line %d, ErrNo %d, Message: %s', @ErrSev, @ErrState, @ErrProc, @ErrLine, @ErrNum, @ErrMsg);
        RETURN @ErrNum;
   END CATCH
   RETURN 0;
END

现在我想创建另一个存储过程,它将执行第一个存储过程并将其保存为CSV

所以这是我们的第二个存储过程:

CREATE PROCEDURE [dbo].[stpEXPORT_COUNTRIES]
AS

BEGIN  
    BEGIN TRY 

     DECLARE @FileName AS NVARCHAR(50)='PutFileName.CSV';
     DECLARE @Path AS NVARCHAR(50)=' C:\\PutPathWhereYouWantToSaveFile';

     declare @sql varchar(8000)select @sql = 'bcp "EXEC YourDatabaseName.dbo.stpCOUNTRIES" queryout '+@Path+@FileName+' /w /t, -T -S' + @@servername 
     exec master..xp_cmdshell @sql

    END TRY
    BEGIN CATCH
        Declare @ErrMsg   nvarchar(200) = ERROR_MESSAGE(),
                @ErrLine  int = ERROR_LINE(),
                @ErrNum   int = ERROR_NUMBER(),
                @ErrSev   int = ERROR_SEVERITY(),
                @ErrState int = ERROR_STATE(),
                @ErrProc  sysname = ERROR_PROCEDURE();
        RAISERROR('ERROR in [%s] Line %d, ErrNo %d, Message: %s', @ErrSev, @ErrState, @ErrProc, @ErrLine, @ErrNum, @ErrMsg);
        RETURN @ErrNum;
   END CATCH
   RETURN 0;
END

* CSV fie的编码为UTF8