1

我正在寻求帮助,通过 SQL Server 查询将数据导出到由|(管道)分隔的平面文件中。
我已经在 Sybase SQL 中完成了这项工作,OUTPUT在我的代码中使用该函数没有问题:

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

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

更新

我应该进一步澄清这一点。我想file.sql通过 VB 脚本执行此语句,以便将手动过程变为自动化过程。SQL Server Management Studio 中的任何手动功能都将不起作用。xp_cmdshell也不是一个选项,因为 DBA 不允许这样做。

4

4 回答 4

5
  1. 在 SSMS 中,转到工具 -> 选项 -> 查询结果 -> SQL Server -> 结果到文本
  2. 在此窗格中选择输出格式:客户分隔符,然后输入“|”
  3. 返回到您的查询并选择 Query -> Results to File (Ctrl+Shift+F)
  4. 执行您的查询,您将被要求选择文件路径和名称

文件将以 .rpt 扩展名保存,您可以将其更改为 .txt

于 2013-08-02T18:22:47.990 回答
1

根据您的更新:

我应该进一步澄清这一点。我想通过 VB 脚本执行这个 file.sql 语句,以便将手动过程变成自动化过程。SQL Server Management Studio 中的任何手动功能都将不起作用。xp_cmdshell 也不是一个选项,因为 DBA 不允许它。

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

于 2013-08-02T20:44:04.593 回答
1

我必须一直将查询导出到平面文件中,所以这是我的解决方案。基本上我创建了一个具有查询(记得放入表全名),文件名,目录路径作为参数的过程。值用“|”分隔 默认情况下,但您可以更改它..

不知道这些是否是最佳实践,它对我有用,安全性不是我正在使用的数据库的问题。

BCP 实用程序几乎可以自己解决问题。在创建过程之前,请确保设置正确的权限: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:\'
于 2015-11-17T01:01:13.663 回答
0

Here is the command:

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

where -f is there for a format file. This is the link on how to create a format file.http://msdn.microsoft.com/en-us/library/ms178129.aspx

于 2013-08-02T18:32:21.877 回答