使用变量在批处理文件中调用sqlcmd.exe会导致错误:“意外参数”

时间:2016-04-27 21:14:07

标签: sql-server windows batch-file cmd sqlcmd

在Windows批处理文件中,这可以:

sqlcmd.exe -b -S xxMySqlServerNamexx -Q "BACKUP DATABASE xxMyDatabaseNamexx TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression"  

就像这样:

set vSource_SqlServer="xxMySqlServerNamexx"      
sqlcmd.exe -b -S %vSource_SqlServer% -Q "BACKUP DATABASE xxMyDatabaseNamexx TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression"  

但是这个:

set vSource_SqlServer="xxMySqlServerNamexx"  
set vSource_SqlDbName="xxMyDatabaseNamexx"  
sqlcmd.exe -b -S %vSource_SqlServer% -Q "BACKUP DATABASE %vSource_SqlDbName% TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression"  

...导致错误:

Sqlcmd: 'xxMyDatabaseNamexx" TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression"': Unexpected argument. Enter '-?' for help.

正如您所看到的那样,使用变量%vSource_SqlDbName%代替xxMyDatabaseNamexx

令人窒息

是否有正确的方法以这种形式执行此操作(我的意思是,是的,我应该使用Powershell或替代方法,但我在此表单中有几个现有的批处理文件我宁愿转换为使用这种形式的变量,即使它不是完美的方式)?

2 个答案:

答案 0 :(得分:2)

set语句不会取消其参数。 因此set a=b c表示%a%扩展为b cset a="b c"表示展开为"b c"

因此,在您的非工作示例中,您将双引号文本放在双引号字符串中,这不起作用。

set中删除引用,它应该有用。

答案 1 :(得分:0)

设置变量最安全的方法是使用语法(如果command extensions已启用,这是Windows中的默认设置):

set "vSource_SqlDbName=xxMyDatabaseNamexx"

请注意整个表达式的引号,因此它们不会成为扩展值的一部分。因此,%vSource_SqlDbName%已扩展为vSource_SqlDbName