пакетная обработка sqlcmd с использованием операндов больше/меньше

Я пытаюсь создать довольно простой набор выходных данных SQL, используя SQLCMD в пакетном процессе, где содержимое фильтруется по дате каждой записи, находящейся между двумя значениями, заполненными в отдельном рабочем файле. Эти значения были загружены в переменные на предыдущем этапе пакетного файла. Если я использую операции > или ‹, я получаю сообщение об ошибке «Выражение нелогического типа, указанное в контексте, где ожидается условие, рядом с И». Если я изменю операции на = или !=, они обработаются без ошибок, и я получу соответствующие результаты в наборе выходных данных.

Я искал документы и примеры, которые обеспечивают правильный синтаксис для использования операций в пакетной команде 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 " 

person Jerry S    schedule 03.11.2014    source источник


Ответы (2)


Когда я вызываю ваш сценарий (после изменения sqlcmd на echo), я вижу, что ge (>=) и le (<=) интерпретируются оболочкой (выделение добавлено):

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 И 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.

person mojo    schedule 03.11.2014

Символы < и > являются операторами перенаправления 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 для указания запроса командной строки.

person dbenham    schedule 03.11.2014