如何在批处理文件中将本地变量设置为SQL查询结果?

3
有没有办法将SQL查询的结果集存到一个本地变量中,该查询将在批处理文件中运行。我想做的事情类似于以下内容:
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b

varname是我的本地变量。

我在SQL方面比较新,希望得到任何帮助。

4个回答

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

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

Use 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参数)


+1:很好,虽然只读取了一行,但对于这个问题来说已经足够了。 - van

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%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接