如何将SQL Server存储过程的输出存储在.txt文件中

时间:2018-10-21 15:54:46

标签: sql-server

我有这个存储过程;我正在SSMS中打印变量的值。 相反,我想将此结果存储在.txt文件中。

注意:我不想使用右键单击结果然后将结果另存为的SSMS选项来执行此操作。我希望可以直接在存储过程本身中使用任何SQL代码/内置函数来完成此操作。

CREATE PROCEDURE [dbo].[usp_printresulttofile]
AS
BEGIN
    DECLARE @var NVARCHAR(MAX) = ''
    SET @var = 'print this data in txt file'

    PRINT 'Data is : ' + @var   
    /* SQL query here to store result of Print statement in text file */
END

EXEC [dbo].[usp_printresulttofile]

在这里共享更新的工作SP,以便对有类似要求的人有用。感谢@David Browne-微软

ALTER PROCEDURE [dbo].[usp_printresulttofile]
AS
BEGIN
    DECLARE @fileTimeStamp varchar(200) =  convert(varchar,getDate(), 112 )+'_'+ Replace(convert(varchar,getDate(), 114 ),':','')  -- select convert(varchar, getdate(), 121)

    DECLARE @fileExtension varchar(5) = 'txt'
    DECLARE @var NVARCHAR(MAX) = ''
    SET @var = 'print this data in txt file'
    PRINT 'Data is : ' + @var   


  declare @fn varchar(500) = 'c:/log/SP_output_'+@fileTimeStamp+'.'+@fileExtension;
    declare @cmd varchar(8000) = concat('echo ', @var, ' > "', @fn, '"');

    print @cmd 
    exec xp_cmdshell @cmd,  no_output

    set @cmd  = concat('type "', @fn, '"');

    print @cmd 
    exec xp_cmdshell @cmd;

    END
    GO

3 个答案:

答案 0 :(得分:2)

正如评论和其他答案所示,这通常不是一个好主意。但是,无论如何,假设您是SQL Server上的sysadmin,这就是执行该操作的方法。 :)

-- To allow advanced options to be changed.  
EXEC sp_configure 'show advanced options', 1;  
GO  
-- To update the currently configured value for advanced options.  
RECONFIGURE;  
GO  
-- To enable the feature.  
EXEC sp_configure 'xp_cmdshell', 1;  
GO  
-- To update the currently configured value for this feature.  
RECONFIGURE;  
GO

CREATE OR ALTER PROCEDURE [dbo].[usp_printresulttofile]
AS
BEGIN
    DECLARE @var NVARCHAR(MAX) = ''
    SET @var = 'print this data in txt file'
    PRINT 'Data is : ' + @var   

    declare @fn varchar(200) = 'c:\temp\out.txt';

    declare @cmd varchar(8000) = concat('echo ', @var, ' > "', @fn, '"');

    print @cmd 
    exec xp_cmdshell @cmd,  no_output

    set @cmd  = concat('type "', @fn, '"');

    print @cmd 
    exec xp_cmdshell @cmd;


END
go
EXEC [dbo].[usp_printresulttofile]

答案 1 :(得分:1)

我可能建议创建一个批处理文件来完成此操作。您可以简单地做到这一点:

sqlcmd -i ExecSQLProc.sql > Results.txt

将EXEC命令保存在名为ExecSQLProc.sql的文件中,然后使用上面的行创建一个批处理脚本。如果需要,还可以将此附加到调度程序,以便可以定期生成这些脚本。您还可以创建一个过程,以仅使用SQL Server将过程产生的任何结果输出到电子邮件中,并以这种方式查看结果。

通常,我发现最好使用操作系统来处理单个文件,如果要附加结果,则可以选择以下选项:

  1. sqlcmd -i ExecSQLProc.sql >> CumulativeResults.txt
  2. 更新您的存储过程,以跟踪大型容器(例如blob)数据库中的数据,然后在执行脚本时将生成一个包含所有内容的文件。

答案 2 :(得分:0)

使用bcp命令将数据复制为任何格式。您只需要提及所需的格式。就像.text

bcp'从表中选择*'查询输出c:\ sql \ bcp.txt -c -T

以下链接中的示例和说明:- https://www.mssqltips.com/sqlservertip/4353/export-sql-server-records-into-individual-text-files/