2010-01-30 15 views
4

Pour une bibliothèque Perl qui sauvegarde les schémas Sybase pour DBIx :: Class (:: Schema :: Loader), je dois être capable d'introspecter les DEFAULTs et les colonnes calculées.Introspection des valeurs DEFAULT et des colonnes calculées

Supposons que nous ayons:

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

est ici aussi loin que je suis:

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 

Cela me dit que la colonne 'foo' a une procédure stockée avec ID 602182610 qui retourne la valeur. Comment puis-je obtenir l'original 'foo' par défaut de cet ID?

La colonne timestamp n'a pas d'objet de colonne calculé ni de sproc par défaut, mais je dois d'une certaine façon savoir qu'il s'agit en fait d'une colonne d'horodatage. En regardant le type de données renvoyé par DBI, il me dit que c'est 'varbinary', la représentation interne d'un horodatage. Comment savoir si c'est un ou non?

Il me dit aussi que la colonne « HAA » est une colonne calculée, l'objet de cette colonne ayant id 618182667.

Vous cherchez à sysobjects pour cette id me dit peu qui semble utile, sauf:

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

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

Toute aide très appréciée.

Répondre

2

En ce qui concerne votre première question, au sujet des défaillances

select text from syscomments 
where id = 602182610 

Comme pour les colonnes d'horodatage, la colonne type dans les références de syscolumns systypes.type. Dans cette table, la colonne name contient le nom du type de données.

+0

Incidemment qui travaille pour colonnes calculées aussi! Merci beaucoup. –

+0

systypes pour type = 37 renvoie à la fois varbinary et timestamp, comment puis-je savoir si une colonne spécifique est varbinary ou timestamp? –

+0

Si je recherche dans les systypes avec le type et usertype, alors il me permet de distinguer timestamp et varbinary, cool. –

6

Ceci est la requête que je fini par utiliser au cas où quelqu'un est intéressé:

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' 

semble bien fonctionner, même si je dois encore écrire quelques autres tests de type de données :)

+0

A fonctionné plutôt bien pour moi :) –