我可以使用命令行isql并且想要获取给定数据库中所有表的元数据,最好将其放在一个格式化文件中。我该如何实现这个功能?
谢谢。
检查sysobjects和syscolumns表。
这里是Sybase系统表的图示。
所有用户表的列表:
SELECT * FROM sysobjects WHERE type = 'U'
SELECT sc.*
FROM syscolumns sc
INNER JOIN sysobjects so ON sc.id = so.id
WHERE so.name = 'my_table_name'
SELECT *
替换为SELECT sc.*
。 - J.N.sp_help
是你需要的。
根据 Sybase 在 sp_help 系统存储过程的在线文档:
描述
报告关于数据库对象 (在 sysobjects 中列出的任何对象) 的信息,以及关于系统或用户定义的数据类型、计算列和函数索引。列显示 optimistic_index_lock。
语法
sp_help [objname]
[...]
这是 publishers 表的(部分)输出(从在数据库对象上使用 sp_help 中复制):
Name Owner Object_type Create_date
---------------- ----------- ------------- ------------------------------
publishers dbo user table Nov 9 2004 9:57AM
(1 row affected)
Column_name Type Length Prec Scale Nulls Default_name Rule_name
----------- ------- ------ ----- ------- ------- -------------- ----------
pub_id char 4 NULL NULL 0 NULL pub_idrule
pub_name varchar 40 NULL NULL 1 NULL NULL
city varchar 20 NULL NULL 1 NULL NULL
state char 2 NULL NULL 1 NULL NULL
Access_Rule_name Computed_Column_object Identity
------------------- ------------------------- ------------
NULL NULL 0
NULL NULL 0
NULL NULL 0
NULL NULL 0
以下是从使用 sp_help 查看数据库对象中摘取的内容:
若你在不提供对象名称的情况下执行 sp_help,报告会显示 sysobjects 中的每个对象,包括其名称、所有者和对象类型。报告还会显示 systypes 中每种用户定义的数据类型及其名称、存储类型、长度、是否允许空值以及任何默认值或规则与其绑定的信息。此外,报告还会注明对于表或视图,是否已定义了任何主键或外键列。
Sybase IQ:
describe table_name;
SELECT
DB_NAME() TABLE_CATALOG,
NULL TABLE_SCHEMA,
so.name TABLE_NAME,
sc.name COLUMN_NAME,
sc.colid ORDINAL_POSITION,
NULL COLUMN_DEFAULT,
CASE WHEN st.allownulls=1 THEN 'YES'
ELSE 'NO'
END IS_NULLABLE,
st.name DATA_TYPE,
CASE WHEN st.name like '%char%' THEN st.length
END CHARACTER_MAXIMUM_LENGTH,
CASE WHEN st.name like '%char%' THEN st.length
END*2 CHARACTER_OCTET_LENGTH,
CASE WHEN st.name in ('numeric','int') THEN st.length
END NUMERIC_MAXIMUM_LENGTH,
CASE WHEN st.name in ('numeric','int') THEN st.prec
END NUMERIC_PRECISION,
NULL NUMERIC_PRECISION_RADIX,
CASE WHEN st.name in ('numeric','int') THEN st.scale
END NUMERIC_SCALE,
CASE WHEN st.name in ('datetime') THEN st.prec
END DATETIME_PRECISION,
NULL CHARACTER_SET_CATALOG,
NULL CHARACTER_SET_SCHEMA,
NULL COLLATION_CATALOG,
NULL COLLATION_SCHEMA,
NULL DOMAIN_CATALOG,
NULL DOMAIN_SCHEMA,
NULL DOMAIN_NAME
FROM
sysobjects so
INNER JOIN
syscolumns sc
ON sc.id = so.id
inner join systypes st on st.usertype = sc.usertype
WHERE so.name = 'TableName'
您可以使用以下方法在数据库中搜索所有表中的列:
SELECT so.name
FROM sysobjects so
INNER JOIN syscolumns sc ON so.id = sc.id
WHERE sc.name = 'YOUR_COLUMN_NAME'
当查找用户表时,如果想要表所有者的名称,可以使用以下方法:
select su.name + '.' + so.name
from sysobjects so,
sysusers su
where so.type = 'U' and
so.uid = su.uid
order by su.name,
so.name
sp_tables
在 isql 中也可以使用。它会给出当前数据库中表的列表。
select *
FROM sys.syscolumns sc
where tname = 'YOUR_TABLE_NAME'
--and creator='YOUR_USER_NAME' --if you want to further restrict tables
--according to the user name that created it
对于Sybase ASE,sp_columns table_name将返回您正在寻找的所有表元数据。
这里有一种不同的获取元数据的方法。 这个非常有用的SQL命令会将表/视图定义以文本形式返回:
SELECT text FROM syscomments WHERE id = OBJECT_ID('MySchema.MyTable') ORDER BY number, colid2, colid
祝使用愉快 Patrick