SELECT SCH.NAME AS SCHEMA_NAME
,TAB.NAME AS TABLE_NAME
,COL.COLID +1AS COLUMN_ID
,COL.NAME AS COLUMN_NAME
,COLCOMM.COMMENT$ AS COMMENTS
,CASEWHEN COL.TYPE$ NOTLIKE'CLASS%'THEN SF_GET_TYPE_WITH_LENGTH(COL.TYPE$, COL.LENGTH$, COL.SCALE)
ELSE TYPESCH.NAME||'.'||TYPEOBJ.NAME
ENDAS DATATYPE
,CAST(CASEWHEN COL.TYPE$ NOTLIKE'CLASS%'THENCASEWHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') THEN22WHEN COL.SCALE =7AND UNICODE() =1THEN COL.LENGTH$ *4WHEN COL.SCALE =7AND UNICODE() =0THEN COL.LENGTH$ *2ELSE COL.LENGTH$
ENDENDAS NUMBER
) AS DATA_LENGTH
,CAST(CASEWHEN COL.TYPE$ NOTLIKE'CLASS%'THENCASEWHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') THENCASEWHEN COL.LENGTH$ =0THENNULLELSE COL.LENGTH$ ENDWHEN COL.TYPE$ IN ('INTERVAL YEAR TO MONTH','INTERVAL YEAR','INTERVAL MONTH','INTERVAL DAY','INTERVAL DAY TO HOUR','INTERVAL DAY TO MINUTE','INTERVAL DAY TO SECOND','INTERVAL HOUR','INTERVAL HOUR TO MINUTE','INTERVAL HOUR TO SECOND','INTERVAL MINUTE','INTERVAL MINUTE TO SECOND','INTERVAL SECOND') THEN ((COL.SCALE &0XF0)>>4)
ENDENDAS NUMBER
) AS DATA_PRECISION
,CAST(CASEWHEN COL.TYPE$ NOTLIKE'CLASS%'THENCASEWHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') AND COL.LENGTH$=0THENNULLWHEN COL.TYPE$ IN ('INTERVAL YEAR TO MONTH','INTERVAL YEAR','INTERVAL MONTH','INTERVAL DAY','INTERVAL DAY TO HOUR','INTERVAL DAY TO MINUTE','INTERVAL DAY TO SECOND','INTERVAL HOUR','INTERVAL HOUR TO MINUTE','INTERVAL HOUR TO SECOND','INTERVAL MINUTE','INTERVAL MINUTE TO SECOND','INTERVAL SECOND') THEN (COL.SCALE &0X0F)
WHEN COL.TYPE$ LIKE'TIMESTAMP%'THEN (COL.SCALE &0XFF)
ELSE COL.SCALE
ENDENDAS NUMBER
) AS DATA_SCALE
,COL.NULLABLE$ AS NULLALBE
,COL.DEFVAL AS DATADEFAULT
,CASEWHEN SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID) =1THEN'Y'ENDAS PRIMARY_KEY
FROM SYSOBJECTS TAB
JOIN SYSOBJECTS SCH ON SCH.TYPE$ ='SCH'AND SCH.ID = TAB.SCHID
JOIN SYSCOLUMNS COL ON COL.ID = TAB.ID
LEFTJOIN SYSCOLUMNCOMMENTS COLCOMM ON COLCOMM.SCHNAME = SCH.NAME AND COLCOMM.TVNAME = TAB.NAME AND COLCOMM.COLNAME = COL.NAME
LEFTJOIN SYSCONS CONS ON CONS.TYPE$ ='P'AND CONS.TABLEID = TAB.ID
LEFTJOIN SYSINDEXES IDXINFO ON IDXINFO.ID = CONS.INDEXID
LEFTJOIN SYSOBJECTS TYPEOBJ ON TYPEOBJ.ID = SUBSTR(COL.TYPE$,6)
LEFTJOIN SYSOBJECTS TYPESCH ON TYPESCH.ID = TYPEOBJ.SCHID
WHERE SCH.NAME ='sbww'AND TAB.NAME ='person'--AND COL.TYPE$ LIKE 'CLASS%'ORDERBY TAB.NAME,COL.COLID
CLASS后跟随的ID值是这个自定义类型对象的ID,可以在SYSOBJECTS中查到类型对象名,你可以用下面这个SQL验证下
SELECT SCH.NAME AS SCHEMA_NAME ,TAB.NAME AS TABLE_NAME ,COL.COLID + 1 AS COLUMN_ID ,COL.NAME AS COLUMN_NAME ,COLCOMM.COMMENT$ AS COMMENTS ,CASE WHEN COL.TYPE$ NOT LIKE 'CLASS%' THEN SF_GET_TYPE_WITH_LENGTH(COL.TYPE$, COL.LENGTH$, COL.SCALE) ELSE TYPESCH.NAME||'.'||TYPEOBJ.NAME END AS DATATYPE ,CAST(CASE WHEN COL.TYPE$ NOT LIKE 'CLASS%' THEN CASE WHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') THEN 22 WHEN COL.SCALE = 7 AND UNICODE() = 1 THEN COL.LENGTH$ * 4 WHEN COL.SCALE = 7 AND UNICODE() = 0 THEN COL.LENGTH$ * 2 ELSE COL.LENGTH$ END END AS NUMBER ) AS DATA_LENGTH ,CAST(CASE WHEN COL.TYPE$ NOT LIKE 'CLASS%' THEN CASE WHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') THEN CASE WHEN COL.LENGTH$ = 0 THEN NULL ELSE COL.LENGTH$ END WHEN COL.TYPE$ IN ('INTERVAL YEAR TO MONTH','INTERVAL YEAR','INTERVAL MONTH','INTERVAL DAY','INTERVAL DAY TO HOUR','INTERVAL DAY TO MINUTE','INTERVAL DAY TO SECOND','INTERVAL HOUR','INTERVAL HOUR TO MINUTE','INTERVAL HOUR TO SECOND','INTERVAL MINUTE','INTERVAL MINUTE TO SECOND','INTERVAL SECOND') THEN ((COL.SCALE & 0XF0)>>4) END END AS NUMBER ) AS DATA_PRECISION ,CAST(CASE WHEN COL.TYPE$ NOT LIKE 'CLASS%' THEN CASE WHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') AND COL.LENGTH$=0 THEN NULL WHEN COL.TYPE$ IN ('INTERVAL YEAR TO MONTH','INTERVAL YEAR','INTERVAL MONTH','INTERVAL DAY','INTERVAL DAY TO HOUR','INTERVAL DAY TO MINUTE','INTERVAL DAY TO SECOND','INTERVAL HOUR','INTERVAL HOUR TO MINUTE','INTERVAL HOUR TO SECOND','INTERVAL MINUTE','INTERVAL MINUTE TO SECOND','INTERVAL SECOND') THEN (COL.SCALE & 0X0F) WHEN COL.TYPE$ LIKE 'TIMESTAMP%' THEN (COL.SCALE & 0XFF) ELSE COL.SCALE END END AS NUMBER ) AS DATA_SCALE ,COL.NULLABLE$ AS NULLALBE ,COL.DEFVAL AS DATADEFAULT ,CASE WHEN SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID) = 1 THEN 'Y' END AS PRIMARY_KEY FROM SYSOBJECTS TAB JOIN SYSOBJECTS SCH ON SCH.TYPE$ = 'SCH' AND SCH.ID = TAB.SCHID JOIN SYSCOLUMNS COL ON COL.ID = TAB.ID LEFT JOIN SYSCOLUMNCOMMENTS COLCOMM ON COLCOMM.SCHNAME = SCH.NAME AND COLCOMM.TVNAME = TAB.NAME AND COLCOMM.COLNAME = COL.NAME LEFT JOIN SYSCONS CONS ON CONS.TYPE$ = 'P' AND CONS.TABLEID = TAB.ID LEFT JOIN SYSINDEXES IDXINFO ON IDXINFO.ID = CONS.INDEXID LEFT JOIN SYSOBJECTS TYPEOBJ ON TYPEOBJ.ID = SUBSTR(COL.TYPE$,6) LEFT JOIN SYSOBJECTS TYPESCH ON TYPESCH.ID = TYPEOBJ.SCHID WHERE SCH.NAME = 'sbww' AND TAB.NAME = 'person' --AND COL.TYPE$ LIKE 'CLASS%' ORDER BY TAB.NAME,COL.COLID