获取 Sybase 中临时表的列

5
有没有办法在 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临时表的列名?


你尝试过使用OBJECT_ID('tempdb..#mytable')进行搜索吗? - Andriy M
@Andriy - 我删除了我的答案,建议使用SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID('tempdb..#mytable'),因为OP说“在Sybase上它返回空”。 - Martin Smith
3个回答

2
抱歉,我没有Sybase来尝试。但是,我可以告诉你我认为的答案,不过你可能需要一些努力才能正确使用语法。基本上,根据文档,只要从tempdb调用,就可以在临时表上使用sp_help命令。以下是Sybase的引用:

系统存储过程(如sp_help)仅在您从tempdb调用它们时才适用于临时表。

参考资料

以下是如何使用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) 方法检索临时表列。

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)。这就是为什么我仍然添加了column status。对于identity(位7),一切都按预期工作。如果有任何解释,将非常感激。
  • 使用isql时,请从足够宽度开始(例如-w160)
  • syscolumns.name和systypes.name的默认列宽度非常大,因此我正在使用substring(....)。如果您的列名不适合,请调整复制字符的数量(substring()的最后一个参数)。
  • 通过省略表名中的'tempdb..',该查询在使用sp_xxx命令之前,也可用于普通非tempdb表。

-2

试试这个

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引用。


这个修复为什么能解决问题? - Nightfirecat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接