有关的转储的Sybase模式为DBIx ::类(::架构::装载机)一个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来获取原始默认“富”?

在timestamp列没有计算列对象,也不是一个默认的存储过程,但我不知要知道,它实际上是一个时间戳列。纵观通过DBI它返回的数据类型告诉我,这是“VARBINARY”,时间戳的内部表示。我怎么知道它是或不是一个?

它也告诉我,列“ADT”是计算列,对于具有编号618182667此列中的对象。

希望在sysobjects该ID告诉我小,除了似乎有用的:

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

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

任何帮助非常赞赏。

有帮助吗?

解决方案

关于第一个问题,约默认

select text from syscomments 
where id = 602182610

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

其他提示

这是我最终使用的情况下,任何人查询的爱好:

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'

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top