我已经开发了以下脚本:
declare @query nvarchar(1000)
declare @Loop int
declare @Whse table
( ID int identity primary key
, WhseLink int)
insert into @Whse
( WhseLink )
select WhseLink from WhseMst
select @Loop = min(ID) from @Whse
while @Loop is not null
begin
set @query = 'exec _bspWhUtilAddAllStkToWh('+cast((select WhseLink from @Whse where ID = @Loop) as varchar)+')'
exec @query
select @Loop = min(ID) from @Whse where ID>@Loop
end
基于上述内容,出现以下错误:
找不到存储过程'exec _bspWhUtilAddAllStkToWh 2'
我检查了以下Link,该用户也遇到了同样的问题,但是由于存储过程实际上存在并且当我运行相同的脚本时,我认为这一点与之不同单独,它可以工作。
我尝试添加方括号,以使@query最终看起来像这样:'exec(_bspWhUtilAddAllStkToWh)2',但是我仍然收到相同的错误。
我想念什么?
答案 0 :(得分:2)
理想情况下,您应该不惜一切代价避免循环。在您的情况下,我会考虑将过程更改为接收表值函数,以便您可以接收整个Warehouse Links集合,并对整个过程执行过程中的所有操作。但是假设您无法执行此操作,则可以在此处使用游标,而忘记了动态sql,因为它不是必需的。
类似这样的事情要简单得多。
declare @WarehouseLink int
declare Warehouses cursor local fast_forward
for
select WhseLink
from WhseMst
fetch next from Warehouses into @WarehouseLink
while @@FETCH_STATUS = 0
begin
exec _bspWhUtilAddAllStkToWh @WarehouseLink
fetch next from Warehouses into @WarehouseLink
end