2010-01-30 92 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