2013-01-14 2 views
0

헤더 행이있는 SQL과 탭으로 구분 된 csv 파일로 쿼리를 내보내는 인터넷에서 bat 스크립트를 발견했습니다. 스크립트는 훌륭하게 작동하지만 표 형식이 아닌 쉼표로 구분 된 파일 형식이어야합니다.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 옵션을 살펴보십시오.

field_term -t

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