SQLSERVER,不使用BCP,把查询结果输出为txt文本文件的存储过程

当BCP命令因服务器安全限制无法使用时,该存储过程提供了一种在SQLSERVER中将查询结果直接导出为TXT文本文件的方法。

 SQLSERVER,不使用BCP,把查询结果输出为txt文本文件的存储过程

由于有些服务器上,数据库由于服务器安全问题,禁用了cmd_shell 不能用BCP进行查询结果文本化输出。

所以特写了个存储过程。用于生成文本文件

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO


ALTER  PROCEDURE stp_ExportDataToTxt
/************************************************************************
 *                    Powered by Tang Ren (R)                           *
 *                          2007-7-11                                   *
 ***********************************************************************
*/


      
@sqlstr nvarchar(4000),                   --查询语句
      @path nvarchar(1000),                --文件保存文件夹
      @fname nvarchar(250)                --文件保存名字
as
    
--Define variable
    declare @strPath varchar(300)         --文件保存的地址 
    declare @colsCount int
    
declare @hr int
    
DECLARE @object int  
    
DECLARE @src varchar(255), @desc   varchar(255)   
    
Declare @file int   
        
declare @sql varchar(1000)
    
declare @tbname sysname
    
        
--Initialize variable
    set @tbname = 'tb_' + convert(varchar(40),newid()) 
    
set @sql = replace(@sqlstr,'from','into ['+@tbname+'] from')
    
set @strPath = ''
    
print @sql
    
exec(@sql)

    
--Estimate the dir suffix, if it not end in '' then add it.
    if right(@path,1)<>''
      
set @path=@path+''
    
set   @strPath=@path+@fname 
    
print @strPath    

    
--Create FSO Object for file operation.
    EXEC   @hr   =   sp_OACreate   'Scripting.FileSystemObject',   @object   OUT   
    
IF   @hr   <>   0   
    
BEGIN   
          
EXEC   sp_OAGetErrorInfo   @object,   @src   OUT,   @desc   OUT     
          
SELECT   hr=convert(varbinary(4),@hr),   Source=@src,   Description=@desc   
            
RETURN   
    
END   
    
        
-- Create File ,if file exist then override it.
    EXEC   @hr   =   sp_OAMethod   @object,   'CreateTextFile',   @file   OUTPUT   ,   @strPath   
    
IF   @hr   <>   0   
    
BEGIN   
          
EXEC   sp_OAGetErrorInfo   @object   
            
RETURN   
    
END
    
    
set @sql ='select * from syscolumns where id=object_id('''+@tbname+''')'
    
print object_id(@tbname)

    
-- Create initial field name with each columns
    declare @name varchar(1000)
    
declare @flag int
    
set @name=''
    
set @flag=0
    
declare cur_data CURSOR for
    
select name from syscolumns where id=object_id(@tbname)
    
open cur_data
    
fetch next from cur_data into @name
    
while @@fetch_status=0
    
begin
      
if @flag=1
        
exec sp_OAMethod @file,'Write',NULL,','
      
exec sp_OAMethod @file,'Write',NULL,@name
      
set @flag=1
      
fetch next from cur_data into @name
    
end
    
close cur_data
    
deallocate cur_data
 
    
EXEC   @hr   =   sp_OAMethod   @file,   'Close',NULL   
    
IF   @hr   <>   0   
    
BEGIN   
          
EXEC   sp_OAGetErrorInfo   @object   
            
RETURN   
    
END   
    
    
set @sql = 'insert into openrowset(''microsoft.jet.oledb.4.0'',''text;hdr=no;database='+@path+''',''select * from['+@fname+']'')' +@sqlstr
    
print @sql
    
exec(@sql)

    
set @sql='drop table ['+@tbname+']'
    
print @sql
    
exec(@sql)

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
 
SQL Server 提供多种方式将查询结果导出为 CSV 文件,以下是几种常见且实用的方法。 ### 使用 sqlcmd 命令行工具导出为 CSV 文件 可以通过 `sqlcmd` 命令行工具执行查询并将结果输出为 CSV 文件。该方式适用于自动化脚本和定时任务。例如: ```bash sqlcmd -S 186.168.100.6 -d ecology -k -I -E -Q "SET NOCOUNT ON; SELECT * FROM test;" -o "D:\MyData.csv" -h-1 -s"^" -W -w 9999 ``` 上述命令中,`-S` 指定服务器地址,`-d` 指定数据库,`-Q` 指定查询语句,`-o` 指定输出文件路径,`-s` 设置字段分隔符(如 `","` 表示 CSV 标准格式),`-h-1` 表示显示标题行,若需包含列名,可调整参数或通过其他方式处理 [^1]。 ### 使用 SQL Server Management Studio (SSMS) 导出向导 SQL Server Management Studio 提供图形化界面,支持将查询结果导出为 CSV 文件。具体操作如下: 1. 执行查询后,右键点击结果窗口,选择“将结果另存为”。 2. 在保存对话框中选择 `.csv` 格式文件,设置保存路径并点击“保存”。 此方法适用于手动导出操作,简单快捷,但适合批量或自动化处理 [^1]。 ### 使用 T-SQL 查询结合 bcp 工具导出 `bcp` 是 SQL Server 提供的命令行工具,支持将查询结果导出为文本文件,包括 CSV 格式。例如: ```bash bcp "SELECT * FROM ecology.dbo.test" queryout "D:\MyData.csv" -c -t, -T -S 186.168.100.6 ``` 其中,`-c` 表示使用字符数据类型,`-t` 指定字段分隔符(如 `","`),`-T` 表示使用信任连接,`-S` 指定服务器地址 [^1]。 ### 使用存储过程导出带列名的 CSV 文件 如果需要导出包含列名的 CSV 文件,可以通过自定义存储过程实现。例如: ```sql EXEC p_exporttb @sqlstr='SELECT * FROM [Demo_A]', @path='C:\', @fname='Export2csv_ByProc.csv', @sheetname='Sheet1' ``` 此方式适用于需要灵活控制导出格式的场景,如导出到 Excel 或 CSV 并包含列标题 [^2]。 ### 使用 PowerShell 脚本导出 PowerShell 提供了丰富的数据库操作能力,可以结合 SQL 查询和导出功能。例如: ```powershell $connectionString = "Server=186.168.100.6;Database=ecology;Integrated Security=True;" $query = "SELECT * FROM test" $connection = New-Object System.Data.SqlClient.SqlConnection $connection.ConnectionString = $connectionString $connection.Open() $command = $connection.CreateCommand() $command.CommandText = $query $reader = $command.ExecuteReader() $dt = New-Object System.Data.DataTable $dt.Load($reader) $connection.Close() $dt | Export-Csv -Path "D:\MyData.csv" -NoTypeInformation ``` 此方法适用于需要高度定制化和集成到自动化流程中的场景 。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值