2011-12-18 14 views
8

tengo este código:¿Cómo obtengo el tipo de columna de la tabla?

select a.id as tableid, 
    a.name as tableName, 
    b.name as columnName, 
    b.status as columnStatus, 
    b.type as columnType 
    from sysobjects a 
    LEFT JOIN syscolumns b 
    ON a.id = b.id 
    WHERE a.name = 'table_name' 

Ahora, el columType muestra números. Quiero obtener el nombre del columnType, que reside en la columna 'nombre' en la tabla 'systypes'. ¿Cómo puedo hacer eso? Simple LEFT JOIN dará como resultado filas duplicadas.

Respuesta

10

que he visto en Sybase 15.0 y este es el código que usted tiene que utilizar:

select o.id [tableid], o.name [tableName], c.name [columnName], c.status [columnStatus], t.name [columnType] from sysobjects o 
inner join syscolumns c on c.id = o.id 
inner join systypes t on t.usertype = c.usertype 
where o.type = 'U' and o.name in ('tablename') 
+0

tengo esto: 'code' – Iyas

+0

Parece que en la tabla systypes, hay entradas duplicadas para la columna 'type' con valor 39. Esto explica por qué obtengo filas adicionales usando su código. Los valores de columna 'nombre' son 'sysname', 'nvarchar', 'varchar' para tipo = 39. – Iyas

+0

edité mi respuesta –

3
select o.id [tableid], o.name [tableName], 
c.name [columnName], c.status [columnStatus], 
t.name [columnType] from sysobjects o 
inner join syscolumns c on c.id = o.id 
inner join systypes t on t.type = c.type 
where o.type = 'U' and o.name = 'table_name' 
and t.name not in ('sysname', 'nid', 'uid', 'nvarchar', 'tid', 'nchar') 

que añadir la última línea de @aF. código. No sé cómo explicar esto. Tengo esta respuesta desde aquí: http://www.dbforums.com/sybase/913004-getting-column-type.html#post3355703

+0

Eso está mal. Lo he visto y debes definir el tipo de systypes como User (U) y vincularlo con usertype :) –

0
create function dbo.GetColumnDataTypeName(@TableName TName, @ColumnName TName) 
returns sysname 
as 
begin 
    declare @typeName sysname, 
     @tableId int = object_id(@TableName) 
    select 
    @typeName = type_name(user_type_id) 
    from sys.columns sc 
    where sc.[object_id] = @tableId 
    and sc.Name = @ColumnName 

    return @typeName 
end 
Go 
0
select so.name as table_name, '' as table_description,sc.name as fileld_name,'' as field_description, 
    st.name as format, 
    sc.length as data_length,sc.prec as decimal_places,'' as primary_key, 
    case when sc.status = 8 then 'Y' 
      else 'N' 
    end as nulls 
    from syscolumns sc 
    INNER JOIN sysobjects so ON sc.id = so.id 
    inner join systypes st on sc.type = st.type 
    WHERE so.name in (/*table list*/) 
    and st.name not in ('sysname', 'nid', 'uid', 'nvarchar', 'tid', 'nchar','longsysname','usr_char') 
    order by so.name 
    go 
2

Es necesario unir tanto type y usertype:

SELECT 
o.id  AS tableID, 
o.name AS tableName, 
c.name AS columnName, 
c.status AS columnStatus, 
t.name AS typeName 
FROM  syscolumns AS c NOLOCK 
INNER JOIN systypes AS t NOLOCK 
ON c.type  = t.type 
AND c.usertype = t.usertype 
INNER JOIN sysobjects AS o NOLOCK 
ON c.id = o.id 
INNER JOIN sysusers AS u NOLOCK 
ON o.uid = u.uid 
WHERE o.name = 'table_name' 
AND u.name = 'dbo' 
+0

La respuesta aceptada no me da el resultado correcto, pero sí. – Dan

Cuestiones relacionadas