为什么在bat文件中以下sqlcmd调用返回0行? (手动通过)

问题描述:

我在编写批处理脚本时遇到了麻烦。我已经缩小到似乎打破了,我提供了一个例子。以下代码粘贴到控制台时会返回10行:为什么在bat文件中以下sqlcmd调用返回0行? (手动通过)

set TESTRUNID=111222 
set QUERY="select distinct col1 from Table where col2='%TESTRUNID%' and col3 LIKE '%es'" 
start /B /wait sqlcmd -S dahost -U usr -P pwd -Q %QUERY% -o resfile.txt 

当我将它放入批处理脚本时,它将返回0行!

@echo off 
setlocal EnableDelayedExpansion 
REM remark 
REM remark 
set TESTRUNID=111222 
set QUERY="select distinct col1 from Table where col2='%TESTRUNID%' and col3 LIKE '%es'" 
start /B /wait sqlcmd -S dahost -U usr -P pwd -Q %QUERY% -o resfile.txt 
+0

我无法回答你的问题,但你的WHERE条款看起来很腥。我认为它应该阅读'where testrunid LIKE'%TESTRUNID%''。为什么一个ID有字面百分号? –

+0

@TimBiegeleisen %%是批处理脚本引擎解析TESTRUNID作为上面行中定义的值 – DraxDomax

+0

'%es' - 它只有一个'%' – doctorlove

我认为你正在混合使用百分号来表示(1)批量变量扩展和(2)SQL通配符。里面一个批处理文件,使用双%%标志为SQL通配符:之前它传递给SQLCMD

set QUERY="select distinct col1 from Table where col2='%TESTRUNID%' and col3 LIKE '%%es'" 

双重%标志被转换为单一%符号。

+0

是的,我刚刚从某人的评论中发现了它。我试过你的解决方案,它工作正常!谢谢! 我很困惑我在这里逃避什么? sqlcmd解析引擎还是批处理脚本解析引擎? 如果批处理脚本认为这是一个变量,它应该试图解决它(并在这种情况下达到null) – DraxDomax

+1

不幸的是,批处理脚本有一些不直观的行为。当他们发现一个单一的%时,他们会忽略它。如果您在命令行中输入了相同的命令,则可以使用单个%正常工作。 –

+0

心=吹。谢谢 – DraxDomax