2013-01-14 47 views
0

我在互联网上发现了一个bat脚本,它将SQL查询从标题行导出到制表符分隔的csv文件中。该脚本很好,但是,我需要的文件格式是一个逗号分隔的文件,而不是表格。从SQL导出批处理文件 - 编辑脚本

我已经对脚本的BCP部分进行了一些改动,但它不起作用。有没有人有任何想法?

@ECHO OFF 
REM ------------------------------------------------------------------------------- 
REM Generic script for exporting data to file from SQL Server using a SQL query. 
REM The resulting file will be tab separated with newline as the row delimiter. 
REM A log file is generated and kept in case of an error or when in debug mode. 
REM See command syntax for details. 
REM 
REM History: 
REM 20120327 Lars Rönnbäck CREATED 
REM ------------------------------------------------------------------------------- 
:constants 
SET myCodePage=ACP 
:variables 
SET theQuery=SELECT [D-U-N-S Number], [Company Name], [Street Address Line 1], [Street   Address Line 2], [Street Address Line 3], [Street Address Line 4], Town, [County (Actual)], [Full Postcode], [Telephone Number] FROM B2B_Jan13.dbo.DATA_HQ_1_Site_Level 
SET theFile=C:\B2B_Matching_Automation\Temp_Files\Sites.csv 
SET theServer=localhost 
SET theDebug=%~4 
SET /a aRandomNumber=%random%%%1000 
FOR /F "usebackq tokens=1-7* delims=.:/,- " %%a IN (`ECHO %DATE%_%TIME%`) DO (SET myStartTime=%%a%%b%%c%%d%%e%%f%%g) 
SET myColumnQuery="select top 0 * into [#columns_%myStartTime%_%aRandomNumber%] from (%theQuery%) q; select stuff((select char(9) + c.name from tempdb.sys.columns c where c.object_id = t.object_id order by c.column_id for XML path(''), type).value('.', 'varchar(max)'), 1,1,'') AS Header from tempdb.sys.tables t where t.name like '#columns_%myStartTime%_%aRandomNumber%%%'" 
SET myHeaderFile=%theFile%.%aRandomNumber%.header 
SET myDataFile=%theFile%.%aRandomNumber%.data 
SET myLogFile=%theFile%.%myStartTime%_%aRandomNumber%.log 
:checks 
IF "%theQuery%"=="" (
GOTO syntax 
) 
IF "%theFile%"=="" (
GOTO syntax 
) 
IF "%theServer%"=="" ( 
SET theServer=%COMPUTERNAME% 
) 
:information 
ECHO Start Time: %myStartTime%  >> "%myLogFile%" 2>&1 
ECHO Random Number: %aRandomNumber%  >> "%myLogFile%" 2>&1 
ECHO File:   %theFile%   >> "%myLogFile%" 2>&1 
ECHO Server Name: %theServer%   >> "%myLogFile%" 2>&1 
ECHO Query:        >> "%myLogFile%" 2>&1 
ECHO.         >> "%myLogFile%" 2>&1 
ECHO %theQuery%       >> "%myLogFile%" 2>&1 
:export 
BCP %myColumnQuery% queryout "%myHeaderFile%" -T -S "%theServer%" -a 65535 -c -C %myCodePage% -q >> "%myLogFile%" 2>&1 
IF ERRORLEVEL 1 GOTO error 
BCP "%theQuery%" queryout "%myDataFile%" -T -S "%theServer%" -a 65535 -c -C %myCodePage% -q >> "%myLogFile%" 2>&1 
IF ERRORLEVEL 1 GOTO error 
ECHO.     >> "%myLogFile%" 2>&1 
ECHO Merging files... >> "%myLogFile%" 2>&1 
ECHO.     >> "%myLogFile%" 2>&1 
COPY /A "%myHeaderFile%" + "%myDataFile%" "%theFile%" /B /Y >> "%myLogFile%" 2>&1 
IF ERRORLEVEL 1 GOTO error 
:cleanup 
DEL "%myHeaderFile%" >NUL 2>&1 
IF ERRORLEVEL 1 GOTO error 
DEL "%myDataFile%" >NUL 2>&1 
IF ERRORLEVEL 1 GOTO error 
IF /I NOT [%theDebug%]==[Y] (
DEL "%myLogFile%" 
) 
IF ERRORLEVEL 1 GOTO error 
GOTO end 
:error 
ECHO 
ECHO ERROR: An export error has occured! 
IF NOT [%myLogFile: =%]==[] (
    ECHO Details can be found in: 
    ECHO %myLogFile% 
) 
ECHO 
EXIT /B 1 
:syntax 
    ECHO. 
ECHO SYNTAX: %0 "sql query" "output file" [server] [Y] 
ECHO ------------------------------------------------------------------------------- 
ECHO You must specify an SQL query and an output file name in which the results of 
ECHO the query will be stored. Specifying a server is optional and defaults to the 
ECHO server you are executing on. If a fourth argument is given as Y a log file of 
ECHO the command outputs will be saved in the same folder as the output file. 
ECHO ------------------------------------------------------------------------------- 
:end 
REM This is the end. 

回答

3

查看BCP命令的-t选项。

-t field_term

Specifies the field terminator. The default is \t (tab character). Use this 
parameter to override the default field terminator. For more 
information, see Specify Field and Row Terminators (SQL Server). 

If you specify the field terminator in hexadecimal notation in a bcp.exe command, 
the value will be truncated at 0x00. For example, if 
you specify 0x410041, 0x41 will be used. 

If field_term begins with a hyphen (-) or a forward slash (/), do not include a 
    space between -t and the field_term value. 

Found Here

我没有这个使用自己,但也许这将指向你在正确的方向。

+0

我已经阅读了一遍,并在剧本中进一步演奏了一段时间。 BCP中的'-t'选项正确地使文件逗号分隔,并且与文件的标题行完全关联。 感谢您的帮助。 – user1016171