一存储过程中从临时表的第二列(不知列名)读出数据,语句有写,明明有数据,读出却显示为空,为何?
表的第二列明明有数据却读出来是空的。也不报错。是不是语句上有什么需要改动的?declare @sql varchar(500)  
Create table #B(ttnumb numeric(18,2) null)  
   
  select @sql= 'select  '+col_name(object_id( 'tempdb.dbo.#LOther '),2)+ ' from #LOther '  
  insert into #B exec(@sql)  
select * from #B 
    

解决方案 »

  1.   

    临时表
    SQL Server 支持临时表。临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。临时表有两种类型: 本地临时表 
    以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表。全局临时表 
    以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。现在,临时表的许多传统用途可由具有 table 数据类型的变量替换。
      

  2.   

    这样写不是很严格:
    1.假如#LOther有2列(a和b),当删除b列之后,再又添加一列b,这时表的结构还是a和b两字段,但col_name(...,2)的值就是null了,col_name(...,3)才能取到b;
    2.col_name只能取当前数据库中表的列名,即对于你的例子,由于是临时表在tempdb中,所以只有这样use tempdb select col_name(...)才能取到列名
    3.还是用系统表tempdb..syscolumns来取好些
      

  3.   

    declare @sql varchar(500)
    select @sql= ' select  '+col_name(object_id( '[Table1]'),2)+ ' from [Table1] '
    exec(@sql)
      

  4.   

    临时表的生命周期问题,LZ可以换成全局临时表来做,把#LOther换成##LOther
      

  5.   

    declare @sql varchar(500)   
    Create table #B(ttnumb numeric(18,2) null)   
      select * into Lother from #Lother  
      select @sql=  'select '+col_name(object_id('LOther'),2)+ 'from LOther  '   
      insert into #B exec(@sql) 
      
    drop table Lother
    select * from #B以上语句是我把数据从临时表又重插入一个表再读,读出来的数据却不是列里的数据,而是列名,是怎么回事?
      

  6.   

    多加一干空格.
      select @sql=   'select  '+col_name(object_id( 'LOther '),2)+  'from LOther   '   
    ==>
      select @sql=   'select  '+col_name(object_id( 'LOther '),2)+  ' from LOther   '   
      

  7.   

    结果好好的.set nocount on 
    create table #Lother
    (col1 int, col2 int, col3 int)insert #Lother
    select 1, 2, 3
    union all select 4, 5, 6
    union all select 7, 8, 9select * into Lother from #Lother  GOCreate table #B(ttnumb numeric(18,2) null)    declare @sql varchar(500)  
     select @sql=   'select  '+col_name(object_id( 'LOther'),2)+  ' from LOther   '   
      insert into #B exec(@sql) GO  select * from #B GO
    drop table #Lother
    drop table Lother
    drop table #Bttnumb
    ---------------------------------------
    2.00
    5.00
    8.00
      

  8.   

    我试了,还是一样。应不是这个问题。LOther表是从临时表#LOther 读数据插入时直接生成的。
    不知这里是否有什么问题?
      

  9.   

    临时表#LOther也是插入产生的,列名是动态的。
      

  10.   

    此问题仍未解廖,不知有人能再帮到忙否?
    其中#LOther是动态产生的表,列名也是动态的。
      

  11.   

    我不是解释了么?临时表必须在use tempdb啊,唉,要不你就别用临时表,用永久表代替,完了之后再删掉就OK了,这时就不用use tempdb