2011-05-09 25 views
5

有没有办法让在Sybase临时表的列清单? 假设我有一个名为#mytable得到一个临时表中的列在Sybase

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中临时表的列名?

+0

你试过用OBJECT_ID('tempdb ..#mytable')搜索吗? – 2011-05-09 21:22:00

+0

@Andriy - 我删除了我的答案,提示'SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID('tempdb ..#mytable')',因为OP说“它在Sybase上什么也不会返回” – 2011-05-09 21:46:06

回答

2

我很抱歉,但我不有Sybase尝试了这一点上。但是,我可以给你我认为是答案的东西,但为了让语法正确,你可能需要一点努力。基本上,根据文档,只要您从tempdb开始,可以在临时表上使用sp_help命令。以下是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

试试这个

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的参考。

+0

为什么这会解决问题? – Nightfirecat 2012-11-08 02:28:02

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文档导出,但不知何故我第3位在tempdb..syscolumns中的状态不会相应地改变,请参阅我的示例中的列num。这就是为什么我添加列状态的原因。对于身份(位7),事情按预期工作。任何解释将非常感激。 (例如-w160)
  • syscolumns.name和systypes.name的默认列宽很大,因此我使用子字符串(....)。如果列名不适合,请调整复制的字符数(substring()的最后一个参数)。
  • 通过从表名中省略'tempdb ..',此查询也适用于普通非tempdb表,以防止查询优先于使用sp_xxx命令。