Windows CMD执行docker exec调用sqlcmd报DATABASE未知选项原因问询
错误原因
- 核心是Windows CMD的引号解析规则差异:CMD仅将双引号
"识别为合法的字符串包裹标记,单引号'没有特殊语义,不会被判定为整块参数的边界。 - 你在命令中用单引号包裹
-Q的SQL参数时,CMD会直接忽略单引号作用,按空格将整条SQL拆分为多个独立参数传递给sqlcmd。原本需要作为单个参数的ALTER DATABASE MyTest SET READ_COMMITTED_SNAPSHOT ON;GO被拆成'ALTER、DATABASE、MyTest等多段,sqlcmd解析时会将DATABASE识别为未知的命令选项,因此抛出对应错误。 - 替换变量后在Docker CLI(通常为PowerShell或Linux Shell环境)运行正常,是因为这类环境均支持单引号作为字符串包裹符,会将单引号内的内容作为单个完整参数传递,不会出现拆分问题。
解决方案
将-Q参数后包裹SQL语句的单引号替换为双引号即可,修改后的CMD命令如下:
docker exec -it %containerName% /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P %dbPassword% -Q "ALTER DATABASE MyTest SET READ_COMMITTED_SNAPSHOT ON;GO"
如果SQL语句内部本身包含双引号,需要用两个连续的双引号""对内部双引号进行转义,避免CMD提前截断参数。
内容的提问来源于stack exchange,提问作者antnewbee
相关产品推荐
相关产品推荐

