我正在寻找帮助,通过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
不是一个选项。
答案 0 :(得分:4)
文件将以.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几乎可以自行解决这个问题。在创建程序之前,请务必设置正确的权限:this和this。
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