Доступ к возвращаемому значению SQL-запроса в SQLCMD

Я пытаюсь получить значение инструкции SQL, когда я запускаю ее в пакетном файле DOS...

sqlcmd -E -S DEVSERVER -Q "SELECT  COUNT(1) as [CaseCount] FROM Cases"

Я не после уровня ошибки, как в этом qaru.site/info/396351/... вопросе, скорее я после фактического счета, возвращенного из базы данных, поэтому я могу сделать некоторая дополнительная логика.

Ответ 1

Вы можете легко сохранить результат выполнения в текстовый файл, либо используя флаг -o sqlcmd, либо используя стандартный редиректор >. Затем вы можете отформатировать этот файл, удалив заголовок столбца (флаг -h) и удалив строку из SQL Server (SET NOCOUNT ON).

Следующий script будет генерировать файл result.txt с только значением COUNT(1) и разрывом строки:

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 
  > result.txt

И затем прочитайте значение с помощью...

set /p value=< result.txt
echo %value%

Ответ 2

Вы можете избежать дополнительного/временного файла, вызвав sqlcmd.exe с помощью команды FOR:

for /F usebackq %%i in (`sqlcmd -E -S "devserver,4711" -h-1 -Q "SET NOCOUNT ON; SELECT COUNT(1) ..."`) do (
    set count=%%i
)

if not defined count (
    echo Failed to execute SQL statement 1>&2
) else (
    echo %count%
)

Некоторые примечания:

  • Если вы вызываете из интерактивного сеанса CMD.EXE, то есть в командной строке, используйте %i вместо %%i
  • Опция -h-1 сообщает sqlcmd.exe подавлять заголовки столбцов, поэтому вывод действительно представляет собой только одну строку текста.
  • Я использовал вымышленный порт 4711 с сервером, чтобы показать, что вам нужно поместить всю спецификацию "сервер, порт" в двойные кавычки. В противном случае из-за правил синтаксического анализа команд CMD, sqlcmd будет видеть сервер и порт в отношении различных аргументов и сбой.

Ответ 3

Ответ от @GerardoLima был на 90%. Вам также необходимо оценить входное значение с помощью set /a, чтобы удалить ведущие пробелы.

Это не требуется с ответом от @Christian.K

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 > result.txt
set /p raw=< result.txt
echo '%raw%'
set /a value=%raw%
echo '%value%'

Мой результат был

'          0'
'0'