有什么办法来检索本地变量中的SQL查询的结果集;该查询将在批处理文件中运行。我想要做的是这样的:如何将一个局部变量设置为批处理文件中sql查询的结果?
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b
varname是我的本地变量。
我在SQL相当新的所以任何帮助将不胜appreciated1
有什么办法来检索本地变量中的SQL查询的结果集;该查询将在批处理文件中运行。我想要做的是这样的:如何将一个局部变量设置为批处理文件中sql查询的结果?
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b
varname是我的本地变量。
我在SQL相当新的所以任何帮助将不胜appreciated1
结果写入文件,然后读取该文件。在你的情况下,你需要阅读第一行(也可能是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
name
长于默认的80个字符时SET NOCOUNT ON;
SET NOCOUNT ON;
在真正查询之前禁用状态字符串如(1 row affected)
您可以将结果写入包含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%
您可以使用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
要非常小心,你与该变量做什么之后,不过,因为它可能包含字符shell对特殊,如>
,<
,&
等
echo %VAR%
,有人决定把下面的字符串中他的名字:做类似以下时,可能会在这里创建自己的某种分批注入漏洞
foo & rd /s q \
如果您知道,只有一个与可用内容的回报,剩下的单线是无用的垃圾,那么你可以打破过早循环:
for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x&goto break
:break
使用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
(中借鉴van's答案osql
参数)
+1:很好,虽然只读取一行,但是这已经足够让这个问题。 – van 2010-03-01 17:20:35