获取sybase中Temp表的列

时间:2011-05-09 13:51:04

标签: sql sybase temp-tables

有没有办法在sybase中获取临时表的列列表? 假设我有一个名为#mytable

的表
select count (*) from  tempdb..#mytable

返回145表示此表中有145行。 我尝试了以下(有一些变化)

select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = '#mytable'

也尝试了

select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = 'tempdb..#mytable'

两人都回来了,结果空洞。

任何想法?在sybase中获取临时表的列名的任何其他原语吗?

3 个答案:

答案 0 :(得分:2)

我道歉但我没有Sybase试试这个。但是,我可以为您提供我认为可以作为答案的内容,但您可能需要花费一些时间才能使语法正确。基本上,根据文档,您可以在临时表上使用sp_help命令,只要您从tempdb执行此操作即可。以下是Sybase的引用:

  

只有从tempdb调用它们时,sp_help等系统过程才能在临时表上工作。

     

Reference

以下是使用sp_help命令的方法:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/sprocs118.htm

OBJECT_ID(tempdb..#mytable)命令不起作用的原因是因为该表中不存在该表名。原因是Sybase确保所有临时表都是唯一的。为了做到这一点,它采用临时表名称(包括井号)并将其截断为13个字符,附加下划线使其成为13个字符(如果它很短),并将17位数的会话ID添加到表名末尾。这样,您就可以拥有一个名为#mytable的临时表,而另一个用户(甚至是另一个会话中的用户)可以具有临时表的完全相同的名称而不会引起冲突。如果您计算出会话ID,则可以构建临时表名称。如果您构建了临时表名称,则可以将其分配给变量(例如@newTableName)并使用SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID(@newTableName)方法检索临时表列。

答案 1 :(得分:0)

好的,我知道,这是一个非常古老的话题 - 但我在其他任何地方找不到足够的答案,所以我用IAmTimCorey的答案作为起点研究自己。这给出了以下结果:

SELECT sc.colid,
       Substring(sc.NAME, 1, 40) 'column name',
       Substring(st.NAME, 1, 40) 'type',
       sc.length,
       sc.prec,
       sc.status,
       ( CASE
           WHEN ( sc.status & 8 ) != 0 THEN 'Y'
           ELSE 'N'
         END )                   AS 'nullable',
       ( CASE
           WHEN ( sc.status & 128 ) != 0 THEN 'Y'
           ELSE 'N'
         END )                   AS 'identity'
FROM   tempdb..syscolumns sc
       INNER JOIN tempdb..sysobjects so
               ON sc.id = so.id
       INNER JOIN systypes st
               ON st.type = sc.type
                  AND st.usertype = sc.usertype
WHERE  so.NAME = 'test'
ORDER  BY sc.colid

示例:

1> create table tempdb..test(id numeric (15,0) identity, string varchar(40), num  numeric(15,0) not null, dt datetime, flt float)
2> go
1> select sc.colid, substring(sc.name, 1, 40) 'column name', substring(st.name, 1, 40) 'type', sc.length, sc.prec, sc.status, (case when (sc.status & 8) != 0 then 'Y' else 'N' end) as nullable, (case when (sc.status & 128) != 0 then 'Y' else 'N' end) as ident from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id inner join systypes st on st.type = sc.type and st.usertype = sc.usertype where so.name = 'test' order by sc.colid
2> go
 colid  column name                              type                                     length      prec status nullable ident
 ------ ---------------------------------------- ---------------------------------------- ----------- ---- ------ -------- -----
      1 id                                       numeric                                            8   15    128 N        Y
      2 string                                   varchar                                           40 NULL      0 N        N
      3 num                                      numeric                                            8   15      0 N        N
      4 dt                                       datetime                                           8 NULL      0 N        N
      5 flt                                      float                                              8 NULL      0 N        N

(5 rows affected)
1>

说明:

  • 可以为空的列的检测源自Sybase文档,但由于我不知道的原因,tempdb..syscolumns中状态的第3位没有相应更改,请参阅我的示例中的列num。这就是我无论如何都添加了列状态的原因。对于身份(第7位),事情按预期工作。任何解释都会非常感激。
  • 使用isql时,请以足够宽度(例如-w160)
  • 开头
  • syscolumns.name和systypes.name的默认列宽非常大,因此我使用的是substring(....)。如果您的列名不合适,请调整复制字符数(substring()的最后一个参数)。
  • 省略' tempdb ..'从表名开始,如果优先使用sp_xxx命令进行查询,则此查询也适用于普通的非tempdb表。

答案 2 :(得分:-1)

试试这个

select sc.id, sc.number, sc.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name like '%mytable%'

在您的选择中没有#或任何其他临时.. #mytable参考。