2014-11-03 76 views
0

我想在批处理中使用SQLCMD生成一个非常基本的SQL输出数据集,其中内容被每个记录的日期过滤为两个值之间的填充单独的工作文件。这些值被加载到批处理文件的前一步中的变量中。如果我使用操作>或<,我会收到一个错误消息,指出'在接近AND的情况下指定的非布尔类型的表达式“。如果我将操作更改为=或!=,它会处理没有错误,并在输出数据集中得到适当的结果。批处理sqlcmd使用大于/小于操作数

我已经搜索了文档和示例,它们提供了在SQLCMD批处理命令中使用操作的适当的sytax,但至今没有人提及>或<。如何在这种情况下指定这些比较或不可能?问题是操作数内容的数据类型?

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 " 

回答

0

当我调用脚本(改变sqlcmdecho后),我看到GE(>=)和Le(<=)越来越被shell解释(强调):

echo -S -d -o \ MD.SPCREQ01 .._。txt -Q“Select FROM_NPA +'/'+ FROM_NXX +' - '+ FROM_NUMBER AS”“From Number”“FROM dbo.MACC128 WHERE CALL_YY + CALL_MM + CALL_DD AND CALL_YY + CALL_MM + CALL_DD ORDER by CALL_YY,CALL_MM,CALL_DD,CONNECT_TIME_HH,CONNECT_TIME_MM,CONNECT_TIME_SS“1>''0 <'

我怀疑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 ing代替)时,我看到了ge和le。

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以指定命令行查询。

相关问题