我正在尝试在Server 2012 R2上使用Windows命令提示符,使用以下命令行运行批处理文件。我想运行一个SQL命令( sqlcmd )并将结果返回到控制台窗口。
这就是我目前正在尝试的内容,但是sqlcmd
一直在追回:
Sqlcmd:'test':参数无效。输入' - ?'寻求帮助。
FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql" -v dbname="test"`) DO (
Echo %%F
)
注意:我还尝试在命令提示符中运行此sqlcmd
命令(上面),没有任何问题。它就像它不喜欢FOR /F
循环或其他东西。
但是,如果我在没有参数/变量的情况下尝试它,它可以完美地运行!
FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql"`) DO (
Echo %%F
)
有没有人知道如何使用sqlcmd
,Windows CMD以及FOR /F
循环将变量传递给我的SQL查询,例如我的第一个例子?
答案 0 :(得分:2)
处理批次代码时,它会按特定顺序经历多个阶段。这些阶段的顺序意味着在这种情况下,您的等号字符=
需要特别注意。 有关这些阶段的完整说明,请阅读this information 。
这是两种方法,其中一种方法已在评论区域中给出。
我已将命令格式化为三行,以便更清晰,无论你是否也这样做都是可选的。
使用插入符=
:
^
For /F "Delims=" %%A In ('
sqlcmd -S localhost -E -i backup.sql -v dbname^=test
') Do Echo %%A
或者,如果您希望双重引用文件名和值:
For /F "Delims=" %%A In ('
sqlcmd -S localhost -E -i "backup.sql" -v dbname^="test"
') Do Echo %%A
用双引号"
围绕命令:
For /F "Delims=" %%A In ('
"sqlcmd -S localhost -E -i backup.sql -v dbname=test"
') Do Echo %%A
For /F "Delims=" %%A In ('
"sqlcmd -S localhost -E -i "back up.sql" -v dbname="my test""
') Do Echo %%A
请注意,如上所示,虽然这可能是一种很好的做法,但Microsoft状态为'File paths that contain spaces must be enclosed in quotation marks' and 'Enclose the value in quotation marks if the value contains spaces'。在您的情况下不需要它们,可能已被省略。