2013-03-14 70 views
0

我正在嘗試使用批處理文件將包含sql代碼的文件轉換爲與MSSQL實用程序bcp一起使用的單個環境變量。 例如,如果InFile.sql包含For循環的輸出中的虛假空間

-- This is a simple statement 
SELECT * 
    FROM table 

ECHO %query%輸出應該是 SELECT * FROM people

下面的代碼對我的作品大部分時間

SETLOCAL=ENABLEDELAYEDEXPANSION 
:: Replace VarOld with VarNew 
FOR /f "delims=" %%a IN ('TYPE InFile.sql') DO (SET line=%%a & ECHO !line:table=people! >> TmpFile1) 

:: Remove comment lines starting with '-' and remove newline characters 
(FOR /f "eol=- delims=" %%a in (TmpFile1) DO SET/p=%%a) <nul >TmpFile2 

:: Create variable 'Query' 
FOR /f "delims=" %%a IN ('TYPE TmpFile2') DO SET query=%%a 

然而,第一部分爲循環在每行的末尾添加3個空格字符,第二個FOR循環添加另一個空格字符,因此結果爲 SELECT * FROM people

我可以應付額外的空間(儘管純粹主義者並不開心!),直到我不得不使用它與一個長的SQL查詢和多個替換步驟 - 文件中的每一行都添加了12個空格字符。額外的空間足以使查詢結果大約8300個字符長 - 對於批處理文件行的Windows 8196字符限制來說太多了。

任何人都可以看到我可以如何刪除這些虛假空間嗎?

回答

1

for循環中使用tokens=*應該在捕獲一行infile.sql時修剪空白。這裏是包含在引號內的一個概念證明,呼應%query%來說明微調:

@echo off 
setlocal enabledelayedexpansion 

set query= 
if "%~1"=="" goto usage 
if not exist "%~1" goto usage 

for /f "usebackq eol=- tokens=*" %%I in ("%~f1") do (
    set "sub=%%I" 
    set query=!query! !sub:table=people! 
) 

:: strip the leading space from %query% 
echo "%query:~1%" 
goto :EOF 

:usage 
echo Usage: %~nx0 sqlfile 

輸出示例:

C:\Users\me\Desktop>type infile.sql 
-- This is a simple statement 
SELECT * 
    FROM table 

C:\Users\me\Desktop>test.bat infile.sql 
"SELECT * FROM people" 
0

的根本問題是,尾部的空格在SET語句和ECHO顯著在重定向器之前的語句。

在你的代碼,你需要%%apeople!後把空格去掉第一FOR這樣:

FOR /f "delims=" %%a IN ('TYPE InFile.sql') DO (SET line=%%a&ECHO !line:table=people!>> TmpFile1) 

接下來的問題是有點更加微妙。在

(FOR /f "eol=- delims=" %%a in (TmpFile1) DO SET/p=%%a) <nul >TmpFile2 

的空間下面/p=%%a是必需的,因爲它提供了構建TmpFile2當從線所做的文本之間的分隔符 - 這導致了多餘的尾隨空格。嘗試用Q替換該空間 - 僅用於測試。

因此,你需要刪除QUERY最終的空間它在最終FOR

SET query=%query:~0,-1% 
建立後