[英]How to set a local variable to the result of sql query in a batch file?
有没有办法在局部变量中检索sql查询的结果集; 查询将在批处理文件中运行。 我想要做的是这样的事情:
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b
varname是我的本地变量。
我是新的sql所以任何帮助将非常感激1
将结果写入文件,然后读取文件。 在您的情况下,您需要阅读第一行(并可能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;
在真正的查询之前禁用状态字符串(1 row affected)
您可以使用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的答案借用osql
参数)
您可以将结果写入包含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%
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.