Sybase系统表关联疑问:syscolumns与systypes多对一及类型不符
问题解答
1. 为何每个列会返回3条类型记录?
你用b.type = c.type作为关联条件时,syscolumns.type存储的是底层基础类型代码,而systypes表中同一个基础类型代码会对应多个条目——这些条目包括系统原生类型、系统别名类型(比如sysname本质是nvarchar(128)的别名),甚至用户自定义类型。比如char、varchar、nvarchar可能共享部分基础类型代码,或者sysname的type值和nvarchar完全相同,这就导致一条列记录会匹配到多条systypes记录,最终返回重复行。
2. 数据类型不符的原因及关联逻辑调整
原因
当前关联条件只匹配了基础类型代码,没有区分具体的类型实例(比如char(8)和它的别名/其他同基础类型的类型),所以查询结果会混入无关的类型条目,和实际表列的类型不符。
调整方案
应该用syscolumns.usertype关联systypes.usertype,因为usertype是每个类型(包括系统类型、自定义类型、别名类型)的唯一标识,能精准匹配到列对应的实际类型。
调整后的SQL如下:
select a.id, a.name as table_name, b.name as column_name, c.name as data_type, b.length, b.prec, b.scale from dbo.sysobjects a inner join dbo.syscolumns b on a.id = b.id inner join dbo.systypes c on b.usertype = c.usertype where a.type = 'U' and a.name = 'mytable'
(注:这里精简了返回字段,你可以根据需要调整显示内容)
执行这个SQL后,每条列记录只会对应一条正确的类型记录,和Aqua Studio中显示的表属性一致。
内容的提问来源于stack exchange,提问作者Godstar
相关产品推荐
相关产品推荐

