2014-11-03 79 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以指定命令行查詢。

相關問題