2011-12-18 74 views
8

我有这样的代码:如何从表中获取列类型?

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' 

现在,columType显示号码。我想获得名为columnType的名字,它存在于表'systypes'的'name'列中。我怎么做?简单的LEFT JOIN将导致重复的行。

回答

10

我已经看到了在Sybase 15.0,这是你必须使用代码:

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

我得到这个:'code' – Iyas 2011-12-19 00:36:44

+0

看来,在表systypes中,有值为39的'type'列有重复条目。这解释了为什么我使用您的代码获得额外的行。 'name'值是type = 39的'sysname','nvarchar','varchar'。 – Iyas 2011-12-19 01:26:41

+0

editted我的回答 – 2011-12-19 09:13:01

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

我从@aF添加的最后一行。码。我不知道该如何解释。我从这里这样的回答:http://www.dbforums.com/sybase/913004-getting-column-type.html#post3355703

+0

后缺少逗号这是错误的。我已经看到它,你必须定义为用户(U)的systypes类型,并将其与usertype链接:) – 2011-12-19 09:14:33

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

有必要加入两个typeusertype

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

接受的答案并没有给我正确的结果,但是这样做。 – Dan 2017-05-15 16:03:57