Question

Pour une bibliothèque Perl qui déverse des schémas Sybase pour DBIx :: Class (:: schéma de Loader), je dois pouvoir introspect colonnes calculées et les paramètres par défaut.

Supposons que nous ayons:

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

Voici 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 le DEFAULT original 'foo' de cet ID?

La colonne d'horodatage ne sont pas calculées objet de colonne ni sproc par défaut, mais je dois en quelque sorte de savoir qu'il est en fait une colonne d'horodatage. En regardant le type de données retourné par DBI car il me dit qu'il est « varbinary », la représentation interne d'un horodatage. Comment puis-je savoir si elle est ou pas?

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

Recherche 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.

Était-ce utile?

La solution

En ce qui concerne votre première question, sur les valeurs par défaut

select text from syscomments 
where id = 602182610

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

Autres conseils

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

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'

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top