【问题标题】:batch sqlcmd using greater than / less than operands使用大于/小于操作数的批处理 sqlcmd
【发布时间】:2014-11-03 18:02:05
【问题描述】:

我正在尝试在批处理过程中使用 SQLCMD 生成一个非常基本的 SQL 输出数据集,其中内容是按每个记录的日期过滤的,这些记录位于一个单独的工作文件中填充的两个值之间。这些值已在批处理文件的前一步中加载到变量中。如果我使用操作 > 或

我已经搜索了为在 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 " 

【问题讨论】:

    标签: batch-file sqlcmd operations


    【解决方案1】:

    当我调用您的脚本时(将 sqlcmd 更改为 echo 之后),我看到 ge (&gt;=) 和 le (&lt;=) 正在被 shell 解释(添加了重点):

    echo -S -d -o \MD.SPCREQ01.._.txt -Q "选择 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 按 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 "
    

    当我运行这个(echoing)时,我看到了 ge 和 le。

    【讨论】:

      【解决方案2】:

      &lt;&gt; 字符是 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 解析过程中它不能用作引号。

      您可以通过将&lt;&gt; 转义为^&lt;^&gt; 来修复您的代码。

      修改您的命令以使引号不会被转义是行不通的,因为在引用文本时您无法继续一行。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 2018-10-30
        • 1970-01-01
        • 2019-12-13
        相关资源
        最近更新 更多