Pregunta

Para una biblioteca Perl que vuelca esquemas de Sybase para DBIx :: Clase (Esquema :: :: Loader), tengo que ser capaz de valores predeterminados Introspect y columnas calculadas.

Supongamos que tenemos:

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

Aquí está la medida de lo que tengo:

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 

Esto me dice que la columna 'foo' tiene un procedimiento almacenado con id 602182610 que devuelve el valor. ¿Cómo consigo el original por defecto 'foo' de esta identificación?

La columna de marca de tiempo hace objeto no haber calculado la columna ni un procedimiento almacenado por defecto, pero de alguna manera necesito saber que es, de hecho, una columna de marca de tiempo. Mirando el tipo de datos devuelto por DBI para que me dice que es 'varbinary', la representación interna de una marca de tiempo. ¿Cómo sé si es o no es una?

También me dice que la columna 'ADT' es una columna calculada, el objeto de esta columna que tiene ID 618182667.

Mirándome a sysobjects para ese id dice poco que parece útil, excepto:

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

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

Cualquier ayuda muy apreciada.

¿Fue útil?

Solución

En cuanto a su primera pregunta, sobre los valores predeterminados

select text from syscomments 
where id = 602182610

En cuanto a la indicación de la hora columnas, la columna de la type en syscolumns referencias systypes.type. En ese columna de la tabla contiene el nombre name tipo de datos.

Otros consejos

Esta es la consulta que terminé usando por si alguien está interesado:

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'

Parece que funciona bien, aunque todavía tengo que escribir más ensayos de tipo de datos:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top