Domanda

Per una libreria Perl che discariche schemi Sybase per DBIx :: Class (:: :: Schema Loader), ho bisogno di essere in grado di impostazioni predefinite introspezione e colonne calcolate.

Supponiamo di avere:

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

Ecco quanto ho ottenuto:

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 

Questo mi dice che la colonna 'pippo' ha una stored procedure con id 602.182.610 che restituisce il valore. Come faccio ad avere il predefinito originale 'foo' da questo id?

La colonna timestamp fa oggetto non hanno calcolato colonna, né una sproc default, ma in qualche modo ho bisogno di sapere che è in effetti una colonna timestamp. Guardando il tipo di dati restituito da DBI per esso mi dice che si tratta di 'varbinary', la rappresentazione interna di un timestamp. Come faccio a sapere se è o non è uno?

Mi dice anche che la colonna 'ADT' è una colonna calcolata, l'oggetto di questa colonna avere id 618.182.667.

mi Guardando in sysobjects per questo id dice poco che sembra utile, tranne:

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

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

Qualsiasi aiuto molto apprezzato.

È stato utile?

Soluzione

Per quanto riguarda la prima domanda, su valori di default

select text from syscomments 
where id = 602182610

Per quanto riguarda le colonne timestamp, la colonna type in syscolumns riferimenti systypes.type. In quella colonna della tabella name contiene il nome tipo di dati.

Altri suggerimenti

Questa è la query ho finito per usare nel caso in cui qualcuno è interessato:

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'

sembra funzionare bene, anche se ho ancora bisogno di scrivere alcuni più test di tipi di dati:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top