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

How can you run sqlcmd in a batch script with passing variables?

我正在尝试在 Server 2012 R2 上使用 Windows 命令提示符来 运行 带有以下命令行的批处理文件。我想 运行 一个 SQL 命令 (sqlcmd) 和 return 结果到控制台 window.

这就是我目前正在尝试的方法,但是 sqlcmd 一直在退缩:

Sqlcmd: 'test': Invalid argument. Enter '-?' for help.

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

注意:我也曾尝试在命令提示符下 运行 仅此 sqlcmd 命令(如上),没有出现任何问题。好像它不喜欢 FOR /F 循环之类的东西。

但是,如果我在没有 parameters/variables 的情况下尝试它,它会完美地工作!

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

有谁知道使用 sqlcmd、Windows CMD 以及 FOR /F 循环将变量传递到我的 SQL 查询的方法,例如我的第一个例子?

处理一行批处理代码时,它会按特定顺序经历多个阶段。这些阶段的顺序意味着在这种情况下,您的等号 = 需要特别注意。 有关这些阶段的完整解释,请阅读 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'。在您的情况下不需要它们,可以省略。