Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures 具有延迟执行的Windows批处理文件使用输入参数调用SQL Server存储过程_Stored Procedures_Batch File - Fatal编程技术网

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...