有没有办法在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中获取临时表的列名的任何其他原语吗?
答案 0 :(得分:2)
我道歉但我没有Sybase试试这个。但是,我可以为您提供我认为可以作为答案的内容,但您可能需要花费一些时间才能使语法正确。基本上,根据文档,您可以在临时表上使用sp_help
命令,只要您从tempdb
执行此操作即可。以下是Sybase的引用:
只有从tempdb调用它们时,sp_help等系统过程才能在临时表上工作。
以下是使用sp_help命令的方法:
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>
说明:
答案 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参考。