Stored procedures 具有延迟执行的Windows批处理文件使用输入参数调用SQL Server存储过程
我有一个带有两个可选输入参数(Stored procedures 具有延迟执行的Windows批处理文件使用输入参数调用SQL Server存储过程,stored-procedures,batch-file,Stored Procedures,Batch File,我有一个带有两个可选输入参数(@freq和@env)的存储过程(zhm.GetBatchCmdList_sp)。存储过程返回我要逐个执行的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
)的存储过程(zhm.GetBatchCmdList_sp
)。存储过程返回我要逐个执行的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输入参数和启用延迟扩展的组合有关。当然,我可能错了,但我一直在谷歌上搜索,找不到任何关于这个组合/问题的帮助
有人能帮我吗?编辑-这是一个完全重写的答案
您的问题是cmd定义中的)
。有两组引号,一组在原始定义中,另一组在FOR in()子句中。净效果是你的)
字符没有被引用,因此它过早地终止IN()子句,语句失败
正如您在评论中所述,更改为“!cmd!”
可以解决您的问题。但是我认为你也可以通过从IN()子句中删除引号来解决这个问题
“Windows(cmd.exe)在解析时使用%var%进行即时扩展,在执行时使用!var!进行延迟扩展。”就是这样。这就是我做错的。我只需要将第一个for..in…do语句中的“%cmd%”更改为“!cmd!”,现在它就可以工作了。谢谢你的帮助。@PingPing-我现在更明白怎么回事了。我已经完全重写了答案。
for /f "usebackq" %%i in (`%cmd%`) do...