我正在尝试使用批处理文件将包含sql代码的文件转换为单个环境变量,以便与MSSQL实用程序bcp一起使用。 例如,如果InFile.sql包含
-- 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
但是,第一个FOR循环在每行的末尾添加3个空格字符,第二个FOR循环添加另一个空格字符,因此结果是
SELECT * FROM people
我可以应付额外的空间(虽然我的纯粹主义者不高兴!)直到我不得不使用它与长SQL查询和多个替换步骤 - 文件中的每一行都添加了12个空格字符。额外的空间足以使得结果查询长约8300个字符 - 对于批处理文件行的Windows'8196字符限制来说太多了。
有人能看到我如何删除这些虚假空间吗?
答案 0 :(得分:1)
在tokens=*
循环中使用for
时,应该在捕获一行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"
答案 1 :(得分:0)
根本问题是尾随空格在重定向器之前的SET语句和ECHO语句中很重要。
在您的代码中,您需要删除第一个%%a
中people!
和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%