【问题标题】:Batch file export from SQL - Script editing从 SQL 导出批处理文件 - 脚本编辑
【发布时间】:2012-12-28 15:34:07
【问题描述】:

我在 Internet 上找到了一个 bat 脚本,该脚本将带有标题行的 SQL 查询导出到一个制表符分隔的 csv 文件中。该脚本效果很好,但是,我需要文件格式为逗号分隔文件而不是表格。

我对脚本的 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.

【问题讨论】:

    标签: sql sql-server batch-file bcp


    【解决方案1】:

    看看 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

    我自己没有使用过这个,但也许这会给你指明正确的方向。

    【讨论】:

    • 我已经通读并进一步使用了脚本。 BCP 中的“-t”选项正确地使文件以逗号分隔,并与文件的标题行完美结合。感谢您的帮助。
    猜你喜欢
    • 2020-12-05
    • 2013-01-22
    • 1970-01-01
    • 2017-07-27
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多