如何在批处理文件中将局部变量设置为sql查询的结果?

时间:2010-02-24 09:08:15

标签: sql database sql-server-2005 batch-file

有没有办法在局部变量中检索sql查询的结果集;查询将在批处理文件中运行。我想做的是这样的事情:

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

varname是我的本地变量。

我是sql中的新手,所以任何帮助都会非常受欢迎1

4 个答案:

答案 0 :(得分: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;禁用状态字符串,如(1 row affected)

答案 1 :(得分: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

答案 2 :(得分: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个参数)

答案 3 :(得分: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%