2010-01-30 57 views
4

对于转储DBIx ::类(::模式::装载机)的Sybase架构一个Perl库,我需要能够自省默认值和计算列。反思默认值和计算列

假设我们有:

create table bar (
    id INTEGER IDENTITY PRIMARY KEY, 
    foo VARCHAR(10) DEFAULT 'foo', 
    adt AS getdate(), 
    ts timestamp 
) 

这里的,据我得到:

select substring(c.name,1,5) name, c.cdefault, c.computedcol from syscolumns c 
join sysobjects o on c.id = o.id where o.name = 'bar' and o.type = 'U' 

name  cdefault computedcol 
---------- ----------- ----------- 
id     0  NULL 
foo   602182610  NULL 
adt     0 618182667 
ts     0  NULL 

这告诉我,列“富”有ID 602182610一个返回值的存储过程。我如何从这个ID获得最初的DEFAULT'foo'?

时间戳列没有计算列对象,也不是一个默认的存储过程,但我不知要知道,它实际上是一个时间戳列。查看DBI返回的数据类型告诉我它是'varbinary',即时间戳的内部表示。我怎么知道它是否是一个?

它还告诉我,列“ADT”是计算列,此列ID为618182667.

寻找在sysobjects该ID的对象告诉我一点不同的是,似乎有用:

select substring(name,1,15) name, type from sysobjects where id = 618182667 

name       type 
------------------------------ ---- 
bar_adt_6181826    C  

任何帮助非常感谢。

回答

2

关于你的第一个问题,关于违约

select text from syscomments 
where id = 602182610 

至于时间戳列,syscolumns中引用systypes.typetype列。在该表中,name列包含数据类型名称。

+0

顺便说一句,对于工程计算列也!非常感谢你。 – 2010-01-31 12:12:07

+0

类型= 37的systypes返回varbinary和timestamp,如何知道特定列是varbinary还是timestamp? – 2010-01-31 12:43:54

+0

如果我用类型和usertype查找systype,那么它可以让我区分时间戳和varbinary,很酷。 – 2010-01-31 12:51:11

6

这是我最后使用的情况下,任何人查询感兴趣:

SELECT c.name name, t.name type, cm.text deflt 
FROM syscolumns c   
JOIN sysobjects o ON c.id = o.id 
LEFT JOIN systypes t ON c.type = t.type AND c.usertype = t.usertype 
LEFT JOIN syscomments cm 
    ON cm.id = CASE WHEN c.cdefault = 0 THEN c.computedcol ELSE c.cdefault END 
WHERE o.name = 'table_name' AND o.type = 'U' 

似乎运作良好,但我还需要多写一些数据类型的测试:)

+0

为我工作得很好:) – 2013-12-26 18:14:36