2011-12-18 71 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