2010-02-24 27 views
3

有什么办法来检索本地变量中的SQL查询的结果集;该查询将在批处理文件中运行。我想要做的是这样的:如何将一个局部变量设置为批处理文件中sql查询的结果?

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

varname是我的本地变量。

我在SQL相当新的所以任何帮助将不胜appreciated1

回答

2

结果写入文件,然后读取该文件。在你的情况下,你需要阅读第一行(也可能是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;SET NOCOUNT ON;在真正查询之前禁用状态字符串如(1 row affected)
0

您可以将结果写入包含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% 
1

您可以使用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 
1

使用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参数)

+0

+1:很好,虽然只读取一行,但是这已经足够让这个问题。 – van 2010-03-01 17:20:35

相关问题