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

时间:2018-03-14 00:57:38

标签: loops batch-file sqlcmd

我正在尝试在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查询,例如我的第一个例子?

1 个答案:

答案 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'。在您的情况下不需要它们,可能已被省略。

相关问题