如何从表中获取列类型?
我有这样的代码:如何从表中获取列类型?
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将导致重复的行。
我已经看到了在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')
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
后缺少逗号这是错误的。我已经看到它,你必须定义为用户(U)的systypes类型,并将其与usertype链接:) – 2011-12-19 09:14:33
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
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
有必要加入两个type
和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'
接受的答案并没有给我正确的结果,但是这样做。 – Dan 2017-05-15 16:03:57
我得到这个:'code' – Iyas 2011-12-19 00:36:44
看来,在表systypes中,有值为39的'type'列有重复条目。这解释了为什么我使用您的代码获得额外的行。 'name'值是type = 39的'sysname','nvarchar','varchar'。 – Iyas 2011-12-19 01:26:41
editted我的回答 – 2011-12-19 09:13:01