0

我有一个zhm.GetBatchCmdList_sp带有两个可选输入参数(@freq和)的存储过程( @env)。存储过程一一返回我要执行的 SSIS 文件和存储过程的单列列表。

我创建了一些测试代码,它们只是将存储过程的结果集回显到控制台:

set freq=D
set env=DEV
set cmd=sqlcmd -S LDNDSM05243\TDS_MAIN2_DEV -d CPRM_3DSTRESS -Q "exec zhm.GetBatchCmdList_sp @freq=$(freq), @freq=$(env)" -h -1
set cmdList=
setlocal enabledelayedexpansion
for /f "usebackq" %%i in (`"%cmd%"`) do (set cmdList=!cmdList! %%i)
for %%v in (%cmdList%) do echo %%v
endlocal

但我遇到了问题。

如果我从上面的“set cmd ....”行中删除输入参数,将其替换为:

set cmd=sqlcmd -S LDNDSM05243\TDS_MAIN2_DEV -d CPRM_3DSTRESS -Q "exec zhm.GetBatchCmdList_sp" -h -1

然后脚本运行。但是,我希望调用者能够将输入变量(即%1%2)传递给脚本(脚本会将这些变量传递给存储过程),以便可以在运行时 为freq和设置不同的值。env

我不知道我做错了什么,但我怀疑它可能与存储的 proc 输入参数的组合和启用延迟扩展有关。当然,我可能是错的,但我一直在谷歌搜索,我找不到任何特定于这个组合/问题的帮助。

任何人都可以帮助我吗?

4

1 回答 1

1

编辑 - 这是一个完全重写的答案

您的问题出)在您对 cmd 的定义中。您有两组引号,一组在原始定义中,另一组在 FOR IN() 子句中。最终结果是您的)字符没有被引用,因此它会提前终止 IN() 子句并且语句失败。

正如您在评论中所说,更改为"!cmd!"解决您的问题。但我认为您也可以通过从 IN() 子句中删除引号来解决它。

for /f "usebackq" %%i in (`%cmd%`) do...
于 2012-10-05T12:46:49.590 回答