动态SQL的查询语句,想把查询结果放入一个临时表,再利用临时表做其它
declare @sql varchar(4000) 
set @sql = 'select .......into #t........'
exec (@sql)select * from #t 消息 208,级别 16,状态 0,第 6 行
对象名  '#t' 无效。有什么方法没有?

解决方案 »

  1.   

    参考:
    IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除
                drop table #tmp
            select * into #tmp from tablename where 1=2 --创建临时表#tmp,其结构与tablename相同        declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
            set @QueryString='select * from tablename '
            insert into #tmp(field1,field2,...) exec(@querystirng) 
      

  2.   

    select top 0 * into #t from tb
    declare @sql varchar(4000)  
    set @sql = 'insert into #t........'
    exec (@sql)select * from #t  
      

  3.   

    或者创建全局临时表。declare @sql varchar(4000)  
    set @sql = 'select .......into ##t........'
    exec (@sql)select * from ##t  
      

  4.   

    declare @sql varchar(4000)  
    create table #t(
    id int,
    name varchar(10),
    ...
    )
    set @sql = 'select .......into #t........'
    exec (@sql)select * from #t 
      

  5.   

    再或者一切事情在@sql内一次性干完。declare @sql varchar(4000)  
    set @sql = 'select .......into #t...........干活区select * from #t 
    '
    exec (@sql)
      

  6.   

    declare @sql varchar(4000)  
    set @sql = 'select .......into #t........;select * from #t  '
    exec (@sql)
      

  7.   

    declare @sql varchar(4000)  
    set @sql = 'select .......into #t........'
    set @sql  = @sql  + ' select * from #t'
    exec (@sql)
      
      

  8.   

    有两种方法:
    第一:创建全局临时表:即以##开头。
    第二:创建表变量:语法如下:
    declare @t table(字段1 类型1,字段2 类型2,……)
      

  9.   

    exec(@sql)的时候创建了一个会话,而当前会话不能调用当前会话以外的临时表
      

  10.   

    大家说的有误。 
     临时表:分全局和本地两类临时表 分别用## 和# 开头区分,记tempdb。 临时表不需要确定表列的数量与类型。全局就是所有用户都能用,看到。 本地是针对某个用户。  临时表不需要声明与创建。 select * into ##table1 from table
     内存表:楼主的情况是内存表,使用@开头来表示的。 需要明确列数量与类型,用前需要声明。 两者区别很多,主要在于内存表性能好, 但不支持事务等。