我有一个存储过程,它从连接表中提供了一些数据。
有些时候,客户希望我们以CSV格式导出这些数据,这些数据可以通过打开excel文件轻松管理。
所以我想创建另一个程序,它将调用给定的存储过程并将其保存为CSV文件。
答案 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