您如何在带有传递变量的批处理脚本中 运行 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'。在您的情况下不需要它们,可以省略。
我正在尝试在 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'。在您的情况下不需要它们,可以省略。