¿Cómo obtengo tipo de columna de la tabla?

Tengo este código:

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 los números. Quiero obtener el nombre de la columnType, que reside en la columna ‘nombre’ en la tabla ‘systypes’. ¿Cómo puedo hacer eso? Simple LEFT JOIN resultará en filas duplicadas.

OriginalEl autor Iyas | 2011-12-18

5 Kommentare

  1. 10

    He visto en Sybase 15.0 y este es el código que debes usar:

    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')
    Tengo este: code
    Parece que en la tabla systypes, hay entradas duplicadas para la columna ‘tipo’ con valor de 39. Esto explica por qué me filas adicionales por el uso de su código. La columna ‘nombre’ valores ‘de tipo sysname’, ‘nvarchar’, ‘varchar’ para tipo = 39.
    editado mi respuesta
    puedes probar ahora 🙂
    el uso de usertype en lugar de type en la cláusula where parece estar dando resultado requerido. Aunque este es un hilo viejo, acaba de confirmar en caso de que alguien se tropieza con un problema similar.

    OriginalEl autor

  2. 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')

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

    Que está mal. Yo la he visto y tiene que definir el systypes tipo de Usuario (U) y el enlace con usertype 🙂

    OriginalEl autor

  3. 2

    Es necesario unirse en ambos 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'
    El aceptó la respuesta no me da el resultado correcto, pero esto no hace.

    OriginalEl autor

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

    OriginalEl autor

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

    OriginalEl autor

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea