пакетен 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 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>'' 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