SQL Server:从file.sql导出到平面文件

时间:2013-08-02 17:13:01

标签: sql sql-server export-to-csv

我正在寻找帮助,通过SQL Server查询将数据导出到由|(管道)分隔的平面文件中。
我在Sybase SQL中使用我的代码中的OUTPUT函数没有遇到任何问题:

SELECT ItemName
FROM Products
WHERE ItemName = 'Gizmo'
; OUTPUT TO Z:\Export.txt FORMAT ASCII DELIMITED BY '\xA6' 

SQL Server是否有这样的功能?如果有,它是如何使用的?

更新

我应该多说一点。我想通过VB脚本执行此file.sql语句,以便将手动过程变为自动过程。 SQL Server Management Studio中的任何手动功能都不起作用。由于DBA不允许,xp_cmdshell不是一个选项。

4 个答案:

答案 0 :(得分:4)

  1. 在SSMS中转到工具 - >选项 - >查询结果 - > SQL Server - >结果到文本
  2. 在此窗格中,选择输出格式:客户分隔符,然后输入“|”
  3. 返回查询并选择查询 - >结果到文件(Ctrl + Shift + F)
  4. 执行查询,系统会要求您选择文件路径和名称
  5. 文件将以.rpt扩展名保存,您可以将其更改为.txt

答案 1 :(得分:1)

根据您的更新:

  

我应该多说一点。我想执行这个   file.sql语句通过VB脚本进行手动处理   进入一个自动化的。 SQL Server中的任何手动功能   Management Studio无法运行。 xp_cmdshell也不是一个选项   因为DBA不会允许它。

您的DBA是否允许您使用SSIS(或数据工具)并具备该功能? 如果是 ,您可以在SSIS(或数据工具)中创建DATA FLOW任务,将查询导出到平面文件,让作业调用包,并且您的VB脚本执行sp_start_job以执行调用包的作业。

答案 2 :(得分:1)

我必须一直将查询导出到flatfiles中,所以这是我的解决方案。 基本上我创建了一个具有Query的过程(记得放入表的全名), 文件名,Dir路径作为参数。值由" |"分隔。默认情况下你可以 改变它..

不知道这些是否是最佳做法,它对我有用,而安全则不然 db的一个问题我正在使用。

BCP utillity几乎可以自行解决这个问题。在创建程序之前,请务必设置正确的权限:thisthis

CREATE PROCEDURE [dbo].[export_table] 
@query VARCHAR(8000)
,@out_file VARCHAR(8000)
,@out_dir VARCHAR(8000)
AS
BEGIN

  DECLARE @temp NVARCHAR(4000)
  DECLARE @query_body VARCHAR(8000)
  DECLARE @header VARCHAR(8000)
  DECLARE @full_header VARCHAR(8000)
  DECLARE @copy VARCHAR(8000)
  DECLARE @del VARCHAR(8000)
  DECLARE @del1 VARCHAR(8000)

  -- CREATE AND EXPORT BODY

  -- drop temp table (when running procedure in same instance)

  IF OBJECT_ID('tempdb..##temp') IS NOT NULL 
  DROP TABLE ##temp 

  -- populate temp with just 1 line so we can take out the header

  SET @temp = 'SELECT TOP 1 * INTO ##temp FROM (' + COALESCE(@query,'') + ') a'  

  -- set up the bcp query removing idents so you dont have to write the query in one line

  SET @query_body = 'bcp "' + COALESCE(@query,'') + '" queryout ' + @out_dir + 'qBody.txt -CACP -T -c -t"|" '
  SET @query_body = REPLACE(REPLACE(@query_body, CHAR(13), ' '), CHAR(10), ' ')
  EXECUTE sp_executesql @temp
  EXEC master..xp_cmdshell @query_body

  -- CREATE AND EXPORT HEADER

  -- set the header using system tables and 
  -- temp table previously created (alias = name) and use bcp to expor the header 

  SELECT @header = 
    COALESCE(@header + ''', ', '') + '''' + name  
    FROM (
      SELECT name 
      FROM tempdb.sys.columns 
      WHERE 
        object_id = object_id('tempdb..##temp') 
    ) b
  SET @header = @header + ''''
  SET @full_header = 'bcp "select '+ @header +'" queryout ' + @out_dir + 'qHeader.txt -CACP -T -c -t"|" '

  -- COPY NEW FILE FROM HEADER AND BODY AND DELETE USED FILES (USING WINDOWS CMD) 

  SET @copy = 'copy /b "' + @out_dir + 'qHeader.txt" + "' + @out_dir + 'qBody.txt" "' + @out_dir + @out_file + '.txt"'
  SET @del = 'del "' + @out_dir + 'qHeader.txt"'
  SET @del1 = 'del "' + @out_dir + 'qBody.txt"'
  EXEC master..xp_cmdshell @full_header
  EXEC master..xp_cmdshell @copy
  EXEC master..xp_cmdshell @del
  EXEC master..xp_cmdshell @del1
END

GO

-- EXEMAPLE OF USAGE

exec export_table
'select 
    column1
    ,column2 as ''escape_quotes'' 
from cnes.dbo.stg_vinculo'
,'file_name'
,'C:\'

答案 3 :(得分:0)

这是命令:

Exec master..xp_cmdshell 'bcp "SELECT * FROM test12" queryout "c:\tempexportfile.txt" -c -T -f "c:\Fotmat.txt"'

其中-f是格式文件。这是关于如何创建格式文件的链接。http://msdn.microsoft.com/en-us/library/ms178129.aspx