【问题标题】:Could not find stored procedure 'exec _bspWhUtilAddAllStkToWh 2'找不到存储过程“exec _bspWhUtilAddAllStkToWh 2”
【发布时间】:2018-09-05 13:42:59
【问题描述】:

我开发了以下脚本:

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',但我仍然收到相同的错误。

我错过了什么?

【问题讨论】:

  • 您是否需要在 proc 名称前加上数据库名称?
  • exec (@query)?
  • 哇!我没有想到。现在可以了!谢谢蜜獾!
  • 您可以使用sp_executesql 将参数值传递给存储过程,无需字符串连接
  • 你为什么首先使用动态sql?这里完全没有必要。而且您应该始终指定 varchars 的长度。 sqlblog.org/2009/10/09/…

标签: sql-server tsql


【解决方案1】:

理想情况下,您应该不惜一切代价避免循环。在您的情况下,我会考虑更改您的程序以接收表值函数,以便您可以接收整个仓库链接集合,并在整个集合中执行您的程序中的任何操作。但是假设你不能这样做,你可以在这里使用游标并忘记动态 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

【讨论】:

  • 太棒了!我会用的!
猜你喜欢
  • 2023-03-30
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多