无效的对象名称' #volume'

时间:2014-07-25 17:02:06

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我收到以下消息

  

无效的对象名称#Volume

在具有以下代码的存储过程的备用运行上。如果twoBD列值<&lt; 48那么它将在TAT列中显示Met。而在第二列中,BD值如下所示

00:20,

00:40

Create PROCEDURE [dbo].[gsktat]
(     
@startdate datetime,
@enddate datetime

)
AS
BEGIN

  SET ANSI_WARNINGS OFF

    create table #volume (Sdate datetime,edate datetime ,vstatus varchar(50)
                            ,twoBD varchar(50),TAT varchar(50),ageing int)

    insert into #volume(Sdate,edate,vstatus,twoBD)
        (select [Start date],[End date],[Status],dbo.[GetWorkingMinss]([Start date],[End date],'ss') from GSK)
    Declare @claimid int
    set @claimid = '48'
    If Exists (Select * from #volume where 
        (SELECT 
         RIGHT('00'+CONVERT(VARCHAR(10),( ((cast(STR(Floor(REPLACE(twoBD,':','.')),8,0)as int)*60+CAST(Right(00.45,2) as int)))%3600)/60),2) 
         +':' 
         + RIGHT('00'+CONVERT(VARCHAR(10), ((cast(STR(Floor(REPLACE(twoBD,':','.')),8,0)as int)*60+CAST(Right(00.45,2) as int)))%60),2) AS [ TAT] 
         )<= @claimid)
    begin
        insert into #volume(TAT)values('Met')
    end
    else
    begin
        insert into #volume(TAT)values('Not Met')
        select * from #volume
    end                         

end

1 个答案:

答案 0 :(得分:1)

如果你要找一个名为#volume的临时表,你必须先创建它。必须在每次使用时完成,因为它是临时的。

由于您没有显示其余代码,因此无法告诉您如何修复它。

添加您现在发布的proc代码

我实际上没有在您的代码中发现问题,无法确定表格,GetWorkingMins()等是否有问题,但不知道这些会导致丢失#volume message。

但我确实看到了一些奇怪的东西。你说错误信息是&#34;无效的对象名称#Volume&#34;但我很确定SQL服务器不会在错误消息中将 #volume 更改为 #Volume - 只是在本地尝试(2005)但事实并非如此。让我想知道你是否还有其他版本的这个proc你实际上正在调用 - sql目录也可能会混淆,所以它可能不是你的代码导致问题,虽然这是一个罕见的问题。在proc的顶部添加一个打印或其他方法,以确保您调用的内容与您认为的内容相同。

另一种可能性是消息可能来自导致奇怪的内部存储过程。尝试在gskstat()中将#volume更改为#myvolume并查看错误消息是否更改

在proc的顶部创建#volume对于调试它是一件好事。在这种情况下,生命周期很明确,#volume将在proc结束时消失。即使调用proc或客户端连接也创建#volume gskstat()也不应该有任何问题(sql将创建第二个#volume表(具有不同的隐藏表名后缀)