2011-12-18 41 views
8

Tôi có mã này:Làm cách nào để lấy loại cột từ bảng?

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' 

Bây giờ, columType hiển thị số. Tôi muốn lấy tên của columnType, nằm trong cột 'name' trong bảng 'systypes'. Làm thế nào để làm điều đó? LEFT JOIN đơn giản sẽ dẫn đến các hàng trùng lặp.

Trả lời

10

Tôi đã nhìn thấy trong Sybase 15.0 và đây là đoạn code mà bạn phải sử dụng:

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

tôi nhận này: 'code' – Iyas

+0

Dường như trong bảng systypes, có các mục trùng lặp cho cột 'type' với giá trị 39. Điều này giải thích tại sao tôi nhận được thêm hàng bằng mã của bạn. Các cột 'tên' giá trị là 'sysname', 'nvarchar', 'varchar' cho loại = 39. – Iyas

+0

editted câu trả lời của tôi –

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

tôi thêm dòng cuối cùng từ @aF. mã. Tôi không biết làm thế nào để giải thích điều này. Tôi nhận được câu trả lời này từ đây: http://www.dbforums.com/sybase/913004-getting-column-type.html#post3355703

+0

Điều đó sai. Tôi đã nhìn thấy nó và bạn phải xác định kiểu systypes là User (U) và liên kết nó với 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

Nó là cần thiết để tham gia vào cả hai 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

Câu trả lời được chấp nhận không cho tôi kết quả chính xác, nhưng điều này có. – Dan

Các vấn đề liên quan