Как установить локальную переменную для результата запроса SQL в пакетном файле? - PullRequest
3 голосов
/ 24 февраля 2010

Есть ли способ получить набор результатов запроса SQL в локальной переменной; запрос должен быть запущен в пакетном файле. Я пытаюсь сделать что-то вроде этого:

set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b

varname - моя локальная переменная.

Я новичок в SQL, поэтому любая помощь будет принята с благодарностью1

Ответы [ 4 ]

2 голосов
/ 24 февраля 2010

Запишите результат в файл, а затем прочитайте файл. В вашем случае вам нужно прочитать первую строку (и, возможно, trim это).

Добавьте следующие параметры в ваш запрос:

osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt
  • -o ...: выходной файл (который вам нужно прочитать позже)
  • -h-1: отключить заголовок
  • -w 9999: чтобы обеспечить правильную обработку случаев, когда ваш name длиннее 80 символов по умолчанию
  • SET NOCOUNT ON; перед реальным запросом для отключения строки состояния, например (1 row affected)
1 голос
/ 25 февраля 2010

Использование set /p:

osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt  

set /p varname=<tempres.txt  

(Заимствование osql параметров из ответа ван )

1 голос
/ 24 февраля 2010

Вы можете использовать for /f для перебора выходных данных команды:

for /f "usebackq delims=" %%x in (`your command`) do ...

Вам вообще не нужен временный файл; здесь вы ничего не получите (за исключением того, что вам нужно подумать о том, где у вас могут быть права на запись, и не забудьте впоследствии удалить файл).

for выполняет итерации по выходным данным, разбивая их на токены. Вот почему в конце есть delims=, который эффективно отключает любые токенизации, чтобы вы не разбили свой вывод на пробелы. Существуют и другие параметры, такие как skip=n, которые пропускают n строк перед началом обработки, которые можно использовать для игнорирования заголовка или около того.

Внутри этого цикла вы можете сделать следующее:

for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x

Будьте очень осторожны с тем, что вы потом делаете с этой переменной, поскольку она может содержать символы, которые оболочка рассматривает как специальные, такие как >, <, & и т. Д. уязвимости Batch Injection при выполнении следующих действий:

echo %VAR%

и кто-то решает вставить в его имя следующую строку:

foo & rd /s q \

Если вы знаете, что возвращается только одна строка с пригодным для использования контентом, а остальное бесполезно, то вы можете преждевременно прервать цикл:

for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x&goto break
:break
0 голосов
/ 24 февраля 2010

Вы можете записать результат в файл, содержащий set операторов.

@echo off
osql -E -S servername -h-1 -Q "set nocount on; select 'set var=42'" > c:\set.bat
call c:\set.bat
echo %VAR%

Это приводит к выводу 42 на экран.Чтобы выбрать имя из таблицы, используйте оператор SQL, например:

select 'set var=' + name from table_name where Id = %siteId%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...