Loops 如何在带有传递变量的批处理脚本中运行sqlcmd?

Loops 如何在带有传递变量的批处理脚本中运行sqlcmd?,loops,batch-file,sqlcmd,Loops,Batch File,Sqlcmd,我正在尝试使用Server2012 R2上的Windows命令提示符,使用以下命令行运行批处理文件。我想运行一个SQL命令(sqlcmd)并将结果返回到控制台窗口 这是我目前正在尝试的,但是sqlcmd不断地抛出: Sqlcmd:“测试”:参数无效。输入“-?”以获取帮助 注意:我还尝试在命令提示符下运行这个sqlcmd命令(如上),没有任何问题。这就好像它不喜欢/F的循环之类的东西 但是,如果我不使用参数/变量来尝试它,它将非常有效 FOR /F "tokens=* USEBACKQ" %%F

我正在尝试使用Server2012 R2上的Windows命令提示符,使用以下命令行运行批处理文件。我想运行一个SQL命令(sqlcmd)并将结果返回到控制台窗口

这是我目前正在尝试的,但是
sqlcmd
不断地抛出:

Sqlcmd:“测试”:参数无效。输入“-?”以获取帮助

注意:我还尝试在命令提示符下运行这个
sqlcmd
命令(如上),没有任何问题。这就好像它不喜欢/F的
循环之类的东西

但是,如果我不使用参数/变量来尝试它,它将非常有效

FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql"`) DO (
    Echo %%F
)

有人知道如何使用
sqlcmd
、Windows CMD以及
FOR/F
循环(如我的第一个示例)将变量传递给我的SQL查询吗?

当处理一行批处理代码时,它会按照特定顺序经过多个阶段。这些阶段的顺序意味着在本例中,您的equals字符,
=
需要特别注意。有关这些阶段的完整说明,请阅读

这里有两种方法,其中一种已经在评论区给出

我已经将命令的格式设置为三行,以便更清晰,您是否也这样做是可选的

用插入符号转义等号字符
=
^

For/F“Delims=“%%A In('
sqlcmd-S localhost-E-i backup.sql-v dbname^=test
“)做回显%%A
或者,如果希望双引号引用文件名和值:

For/F“Delims=“%%A In('
sqlcmd-S localhost-E-i“backup.sql”-v dbname^=“test”
“)做回显%%A

将命令用双引号括起来,

For/F“Delims=“%%A In('
“sqlcmd-S localhost-E-i backup.sql-v dbname=test”
“)做回显%%A

For/F“Delims=“%%A In('
“sqlcmd-S localhost-E-i”backup.sql“-v dbname=“我的测试”
“)做回显%%A

请注意,如上所示,虽然这可能是一个很好的做法,但Microsoft state.。在您的情况下,它们不需要,可以省略。

您需要避开等号:
^=
这是100%的胡萝卜让我上当。谢谢!老实说,我甚至没有在整个命令中使用双引号。不过我总是尝试使用双引号尽可能地绕过参数,除非在极少数情况下,例如机器人复制会被斜杠和双引号弄得发狂。实际上,我使用了第四种方法…整个命令周围没有双引号,参数周围有双引号。@Avro,为了完整起见,我在回答中添加了这个附加场景。
FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql"`) DO (
    Echo %%F
)