ALTER PROCEDURE [dbo].[StatisticTelNumsByUsers] 
-- Add the parameters for the stored procedure here
    @tbName varchar(50),  --订单信息表
@beginTime datetime,  --开始时间
    @endTime   datetime   --统计结束时间
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
        delete from tab_UserStatisticsTels
    declare @strSql varchar(200)
    set @strSql=''
    set @strSql='select userId,count(*) as telNums into #temp1 from '+@tbName+
       ' where OrderDateTime>='+
        ''''+dbo.GetLongStrDateTime(@beginTime,0)+''''+' and OrderDateTime<='+
        ''''+dbo.GetLongStrDateTime(@endTime,0)+''''+' group by all userid'; 
    print(@strSql);
    --删除员工电召统计表内容
    exec(@strSql) 
    set @strSql=''
    set @strSql='select userId,count(*) as HaveCarsNums into #temp2 from '+@tbName+
        ' where OrderDateTime>='+
        ''''+dbo.GetLongStrDateTime(@beginTime,0)+''''+' and OrderDateTime<='+
        ''''+dbo.GetLongStrDateTime(@endTime,0)+''''+' and state=1 group by all userid';
    print(@strSql)
    exec(@strSql)
    select * from #temp1
    select * from #temp2
    select t1.userId,t1.telNums,t2.HaveCarsNums into #temp from #temp1 t1,#temp2 t2  
    where t1.userId=t2.userId 
   insert into tab_UserStatisticsTels(userid,telNums,HaveCarsNums) select * from #temp
drop table #temp1
drop table #temp2
drop table #temp
END
提示 temp1,temp2对象不存在

解决方案 »

  1.   

    不需要用临时表:INSERT INTO tab_UserStatisticsTels(userid,telNums,HaveCarsNums)
    SELECT userId, COUNT(*) AS telNums,
    SUM(CASE state WHEN 1 THEN 1 END) AS HaveCarsNums
    FROM @tbName
    WHERE OrderDateTime BETWEEN @beginTime AND @endTime
    GROUP BY userId
      

  2.   

    #temp1 #temp2 是你在执行sql语句的过程中产生的临时表,他的有效作用域在必须在@strSql中
     select * from #temp1
        select * from #temp2
        select t1.userId,t1.telNums,t2.HaveCarsNums into #temp from #temp1 t1,#temp2 t2  
        where t1.userId=t2.userId 
    而上面这些语句,说明#temp1,#temp2在数据中是存在的
    实际上他是不存在的
    解决办法:把这些语句全放到@strSql中,只用一个exec(@strSql)
      

  3.   

    临时表不用删除,当你的会话结束时系统将自动消毁.创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表
     第一次exec(@strSql)当这个语句结束时,#temp1的生命期就结束了,所以找不到#temp1,同样,第二次批执行后找不到#temp2,要想找到他们最好全部用动态执行
      

  4.   

    本地临时表仅在当前会话中可见;除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去.可以先在外面显式定仪一个临时表CREATE TABLE #t(x INT PRIMARY KEY)
    declare @sql varchar(1000)set @sql='INSERT INTO #t VALUES (2)'
    exec(@sql)
    SELECT Test2Col = x FROM #tGO