从 Sybase 数据库中,我如何获取表的描述(包括字段名称和类型)?

38

我可以使用命令行isql并且想要获取给定数据库中所有表的元数据,最好将其放在一个格式化文件中。我该如何实现这个功能?

谢谢。


我应该提到我对Sybase数据库几乎一无所知。我正在寻找SQL命令。 - aartist
12个回答

74

检查sysobjectssyscolumns表。

这里是Sybase系统表的图示。

所有用户表的列表:

SELECT * FROM sysobjects WHERE type = 'U'

你可以将'U'更改为其他对象:
- C - 计算列 - D - 默认值 - F - SQLJ 函数 - L - 日志 - N - 分区条件 - P - Transact-SQL 或 SQLJ 过程 - PR - 准备对象(由动态 SQL 创建) - R - 规则 - RI - 引用约束 - S - 系统表 - TR - 触发器 - U - 用户表 - V - 视图 - XP - 扩展存储过程
表中的列列表:
SELECT sc.* 
FROM syscolumns sc
INNER JOIN sysobjects so ON sc.id = so.id
WHERE so.name = 'my_table_name'

1
这对于单个表非常接近。 我正在寻找数据库中所有表格上相同的数据。 - aartist
1
我知道这是一个老问题,但是如何获取临时表的相同内容呢?我在sysobjects或syscolumns中找不到它。 - 0fnt
如果您在sysobjects上缺少某些列的权限(就像我一样),请将SELECT *替换为SELECT sc.* - J.N.
海报链接已经失效。Sybase在目前这个时候肯定是被抛弃的软件(这显然不仅仅是因为这个原因)。 - Marcus Junius Brutus
1
如果有人对这个信息仍然感兴趣,我已经用一个可用的网络存档版本替换了海报链接:https://web.archive.org/web/20070112193312/download.sybase.com/pdfdocs/asg1250e/poster.pdf - bjrne

52

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 中每种用户定义的数据类型及其名称、存储类型、长度、是否允许空值以及任何默认值或规则与其绑定的信息。此外,报告还会注明对于表或视图,是否已定义了任何主键或外键列。


4
为什么这个回答没有得到更多的赞?这是完美的解决方案。 - Nicolai
我更喜欢这个解决方案,而不是查询专有的字典表,因为它似乎更简单和更健壮。你是否知道如何正确地从JDBC中获取所有结果集?(参考链接:https://dev59.com/4VrUa4cB1Zd3GeqPou9m) - Lukas Eder
3
链接失效了以至于无法使用sp_help。我尝试使用它,但我的sybase版本显示“错误:未找到存储过程'sp_help'(DBD:准备失败)”。 - Joel

7

Sybase IQ:

describe table_name;

在一个好的答案中,添加一些代码解释总是可取的。请参考@Pascal的答案,他包括了文档链接,并将相关信息复制到这里,是一个很好的例子。 - Heretic Monkey
嗨,我认为Sybase IQ中不存在“describe”命令。 - Jérôme B

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

表名'syscolumns'不明确。 - Melih
尝试使用 dbo.syscolumns? - john k

2

您可以使用以下方法在数据库中搜索所有表中的列:

SELECT so.name 
FROM sysobjects so
INNER JOIN syscolumns sc ON so.id = sc.id 
WHERE sc.name = 'YOUR_COLUMN_NAME'

2

当查找用户表时,如果想要表所有者的名称,可以使用以下方法:

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

1

sp_tables 在 isql 中也可以使用。它会给出当前数据库中表的列表。


0
在我使用的Sybase版本中,以下内容会列出所选表的列列表。
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

我使用的版本是SAP IQ 16(Sybase的新名称)选择@@version; @@version SAP IQ/16.0.102.6.1386/20147/P/sp10.15... - Orhan Celik
2
你把几件事情搞混了...1)Sybase是一家公司的名称,该公司拥有4种不同的RDBMS产品(ASE、SQLAnywhere、IQ、Advantage)...2)大约8年前SAP收购了Sybase,在过去的这8年中,SAP已经逐渐用"SAP"取代了"Sybase"的名称;OP已经标记了问题为"sybase-ase",意思是"Sybase ASE";现在"Sybase ASE"有几个名称..."Sybase ASE"是我们这些忠实的ASE用户使用的名称,而"SAP ASE"则是其他人使用的名称;Sybase ASE(又名SAP ASE)与Sybase IQ(又名SAP IQ)不同,即ASE和IQ是两种不同的RDBMS产品。 - markp-fuso
感谢提供的背景信息。因此,我使用的Sybase产品是SAP IQ(Sybase IQ),而不是ASE版本。 - Orhan Celik

0

对于Sybase ASE,sp_columns table_name将返回您正在寻找的所有表元数据。


0

这里有一种不同的获取元数据的方法。 这个非常有用的SQL命令会将表/视图定义以文本形式返回:

SELECT text FROM syscomments WHERE id = OBJECT_ID('MySchema.MyTable') ORDER BY number, colid2, colid

祝使用愉快 Patrick


1
似乎适用于视图、触发器和存储过程,但不适用于表。 - tehvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接