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



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

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

Sqlcmd:"测试":参数无效。输入"-?"寻求帮助。

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 查询的方法?

处理行批处理代码时,它会按特定顺序经历多个阶段。这些阶段的顺序意味着在这种情况下,您的平等性格,=需要特别注意。有关这些阶段的完整说明,请阅读此信息

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

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

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

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声明,"包含空格的文件路径必须用引号引起来"和"如果值包含空格,请将值括在引号中"。在您的情况下不需要它们,可以省略。

最新更新