批量sqlcmd使用大于/小于操作数

时间:2014-11-03 18:02:05

标签: batch-file sqlcmd operations

我试图在批处理过程中使用SQLCMD生成一个非常基本的SQL输出数据集,其中内容按照每个记录的日期在一个单独的工作文件中填充的两个值之间进行过滤。这些值在批处理文件的先前步骤中加载到变量中。如果我使用操作>或者<我收到一个错误,指出'在预期条件的上下文中指定的非布尔类型的表达式,靠近AND'。如果我将操作更改为=或!=它处理没有错误,我在输出数据集中获得了适当的结果。

我搜索过提供正确sytax的文档和示例,以便在SQLCMD批处理命令中使用操作,到目前为止还没有提到过>或者<。如何指定这些比较或在这种情况下它们不可能?问题是操作数内容的数据类型吗?

SET OutputFile=%reports%\MD.SPCREQ01.%CompNum%.%yyyymmdd%_%hhmmss%.txt

sqlcmd -S %DBServerName% -d %DatabaseName% -o %OutputFile% -Q ^
"Select ^
FROM_NPA + '/' + FROM_NXX + '-' + FROM_NUMBER AS ""From Number"" ^
FROM dbo.MACC128 ^
WHERE CALL_YY + CALL_MM + CALL_DD >= '%FROM-CUT%' ^
AND CALL_YY + CALL_MM + CALL_DD <= '%TO-CUT%' ^
ORDER by CALL_YY, CALL_MM, CALL_DD, CONNECT_TIME_HH, CONNECT_TIME_MM, CONNECT_TIME_SS " 

2 个答案:

答案 0 :(得分:0)

当我调用您的脚本时(将sqlcmd更改为echo后),我发现ge(>=)和le(<=)正在被解释shell(强调补充):

  

echo -S -d -o \ MD.SPCREQ01 .._。txt -Q“选择FROM_NPA +'/'+ FROM_NXX +' - '+ FROM_NUMBER AS”“从数字”“FROM dbo.MACC128 WHERE CALL_YY + CALL_MM + CALL_DD和CALL_YY + CALL_MM + CALL_DD订购CALL_YY,CALL_MM,CALL_DD,CONNECT_TIME_HH,CONNECT_TIME_MM,CONNECT_TIME_SS“ 1&gt;'0&lt;''

我怀疑CMD不像任何合理的“语言”那样完全支持多行字符串。您可能需要按摩字符串的内容才能使其正常工作。

尝试转义gt和lt符号。

SET OutputFile=%reports%\MD.SPCREQ01.%CompNum%.%yyyymmdd%_%hhmmss%.txt

sqlcmd -S %DBServerName% -d %DatabaseName% -o %OutputFile% -Q ^
"Select ^
FROM_NPA + '/' + FROM_NXX + '-' + FROM_NUMBER AS ""From Number"" ^
FROM dbo.MACC128 ^
WHERE CALL_YY + CALL_MM + CALL_DD ^>= '%FROM-CUT%' ^
AND CALL_YY + CALL_MM + CALL_DD ^<= '%TO-CUT%' ^
ORDER by CALL_YY, CALL_MM, CALL_DD, CONNECT_TIME_HH, CONNECT_TIME_MM, CONNECT_TIME_SS "

当我运行这个(echo而不是)时,我会看到ge和le。

答案 1 :(得分:0)

<>字符是cmd.exe重定向运算符 - 必须引用或转义它们(从cmd.exe的角度来看)。你的代码都没有。

您的语句周围有引号,但引号位于行的开头,前一行的结尾以^行继续结束。 cmd.exe解析器中存在一个怪癖,导致续行上的第一个字符被转义。

您的命令相当于:

sqlcmd -S %DBServerName% -d %DatabaseName% -o %OutputFile% -Q ^"Select FROM_NPA + '/' + FROM_NXX + '-' + FROM_NUMBER AS ""From Number"" FROM dbo.MACC128 WHERE CALL_YY + CALL_MM + CALL_DD >= '%FROM-CUT%' AND CALL_YY + CALL_MM + CALL_DD <= '%TO-CUT%' ORDER by CALL_YY, CALL_MM, CALL_DD, CONNECT_TIME_HH, CONNECT_TIME_MM, CONNECT_TIME_SS "

引用已转义,因此在cmd.exe解析期间它不会作为引用。

您可以通过将<>转发为^<^>来修复您的代码。

修改命令是不行的,这样报价就不会被转义,因为在引用文本时你无法继续说话。

您可以将所有内容放在一行并删除所有^,但这很难看。

我认为最好的解决方案是将您的命令放入独立的.SQL文件中,并使用-i选项运行文件而不是-Q来指定命令行查询。< / p>