用于检索给定模式的所有表名的 DB2 查询

Posted

技术标签:

【中文标题】用于检索给定模式的所有表名的 DB2 查询【英文标题】:DB2 Query to retrieve all table names for a given schema 【发布时间】:2011-04-04 18:43:39 【问题描述】:

我只是在寻找一个简单的查询来选择给定架构的所有表名。

例如,我们的数据库有超过 100 个表,我需要找到任何包含子字符串“CUR”的表。拥有所有表格后,我可以使用 like 命令。

【问题讨论】:

【参考方案1】:
select * from sysibm.systables
where owner = 'SCHEMA'
and name like '%CUR%'
and type = 'T';

这将为您提供SCHEMA 架构中包含CUR 的所有表。

有关SYSIBM.SYSTABLES 表的更多详细信息,请参阅here。如果您看一下左侧的导航窗格,您可以得到各种精彩的 DB2 元数据。

请注意,此链接适用于大型机 DB2/z。 DB2/LUW(Linux/UNIX/Windows 之一)的列略有不同。为此,我相信您想要CREATOR 列。

在任何情况下,您都应该检查 IBM 文档以了解您的特定变体。不过,表名几乎可以肯定不会改变,因此请查看SYSIBM.SYSTABLES 了解详细信息。

【讨论】:

SQL0206N "OWNER" is not valid in the context where it is used. SQLSTATE=42703 @Marius,您的 DB2 变体中可能有不同的模式 - 这是 DB2/z 特有的,我们喜欢称之为 real DB2 :-) 例如,在 DB2/LUW 中,您将使用 CREATOR。它不会改变基本答案,即使用systables 我的错:我确实在使用 DB2/LUW 只有 IBM 会将产品移植到不同的操作系统并使其与原始操作系统不兼容... DB2 的 4 个平台(LUW、z/OS、i 和 VSE/VM)不是彼此的移植,它们具有独立的代码库,并且是独立开发的(大部分)。 Db2 for i 甚至不是一个单独的产品,而是 iSeries 操作系统的一个组成部分。请注意,Liunx(包括 zLinux)、Unix 和 Windows 版本是相同的代码库,并且是相同的产品。【参考方案2】:

这应该可行:

select * from syscat.tables

【讨论】:

【参考方案3】:
DB2 LIST TABLES FOR SCHEMA <schema_name>

【讨论】:

此选项的好处是不区分大小写。【参考方案4】:
select name from sysibm.systables 
where name like '%ISP%' 
and type = 'T'

【讨论】:

【参考方案5】:

你应该试试这个:

select TABNAME from syscat.tables where tabschema = 'yourschemaname'";

【讨论】:

【参考方案6】:

您也可以通过在 DB2 中键入 LIST TABLES 来获取表名

【讨论】:

这不是真的。 LIST TABLES 为我生成 0 个表。而 LIST TABLES SCHEMAXresults 在该模式的 796 个表中。因此,LIST TABLES 不一定显示所有表格。【参考方案7】:

使用 DB2 命令(无 SQL)有可能执行

db2 LIST TABLES FOR ALL

这显示了数据库中所有模式中的所有表。

参考:show all tables in DB2 using the LIST command

【讨论】:

如果您不知道要查找的架构,或者想要将数据库中所有表的列表转储到文件中,这将非常方便。 db2 "list tables for all" &gt; tables.txt 这就是我想要的!谢谢!【参考方案8】:

在我的 iSeries 上,我必须从 iNavigator 运行此命令:

select *
from QSYS2.SYSTABLES
where TABLE_SCHEMA
like 'SCHEMA_NAME'
and TYPE = 'T';

【讨论】:

需要 QSYS2.SYSTABLES 才能在 IBM iSeries 上列出 JD Edwards 9.2 表。【参考方案9】:
db2 connect to MY_INSTACE_DB with myuser -- connect to db2    
db2 "select TABNAME from syscat.tables where tabschema = 'mySchema' with ur"
db2 terminate -- end connection

【讨论】:

【参考方案10】:
SELECT
  name
FROM
  SYSIBM.SYSTABLES
WHERE
    type = 'T'
  AND
    creator = 'MySchema'
  AND
    name LIKE 'book_%';

【讨论】:

【参考方案11】:

数据没有太大区别,主要区别在于列顺序 在列表表架构列将在表/视图列之后 在列表中显示详细信息架构列将在列类型之后

【讨论】:

【参考方案12】:

对于 Db2 for Linux、Unix 和 Windows(即 Db2 LUW)或 Db2 Warehouse,请使用 SYSCAT.TABLES 目录视图。例如。

SELECT TABSCHEMA, TABNAME FROM SYSCAT.TABLES WHERE TABSCHEMA LIKE '%CUR%' AND TYPE = 'T'

这是一个 SQL 语句,它将返回包含子字符串 CUR 的所有模式中的所有 标准 表。在 Db2 命令行中,您还可以使用 CLP 命令,例如db2 list tables for all | grep CUR 效果类似

此page 描述了SYSCAT.TABLES 中的列,包括TYPE 列的不同值。

A = Alias
G = Created temporary table
H = Hierarchy table
L = Detached table
N = Nickname
S = Materialized query table
T = Table (untyped)
U = Typed table
V = View (untyped)
W = Typed view

其他常用的目录视图包括

SYSCAT.COLUMNS      Lists the columns in each table, view and nickname
SYSCAT.VIEWS        Full SQL text for view and materialized query tables
SYSCAT.KEYCOLUSE    Column that are in PK, FK or Uniuqe constraints

在 Db2 LUW 中,使用 SYSIBM 目录表(SYSCAT 目录视图从中选择数据)被认为是不好的做法。就列名而言,它们不太一致,不太容易使用,没有文档记录,并且更有可能在版本之间发生变化。

此页面包含所有目录视图的列表Road map to the catalog views


对于 Db2 for z/OS,使用 SYSIBM.TABLES,描述为 here。例如

SELECT CREATOR, NAME FROM SYSIBM.SYSTABLES WHERE OWNER LIKE '%CUR%' AND TYPE = 'T'

对于 Db2 for i(即 iSeries aka AS/400)使用 QSYS2.SYSTABLES 描述为 here

SELECT TABLE_OWNER, TABLE_NAME FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA LIKE '%CUR%' AND TABLE_TYPE = 'T'

对于 DB2 Server for VSE 和 VM,请使用 SYSTEM.SYSCATALOG,此处描述为 DB2 Server for VSE and VM SQL Reference

SELECT CREATOR, TNAME FROM SYSTEM.SYSCATALOG WHERE TABLETYPE = 'R'

【讨论】:

对目录查询使用未提交的读取(例如,在查询末尾添加WITH UR)通常是避免等待其他应用程序未提交目录更改的好主意。 这个答案对我寻找自定义数据库项目的任务非常有帮助。感谢您详细介绍!【参考方案13】:

在 db2warehouse 中我发现“所有者”不存在,所以我描述了表 syscat.systables 并尝试使用 CREATOR 来代替它。

db2 "select NAME from sysibm.systables where CREATOR = '[SCHEMANAME]'and type = 'T'"

【讨论】:

在 Db2 LUW 和 Db2 Warehouse 中使用 SYSCAT.TABLES。它有一个 TABSCHEMA 列 我已更新我的答案以包含 3 个不同 Db2 平台 HTH 的架构/所有者列【参考方案14】:

这是我的工作解决方案:

select tabname as table_name
from syscat.tables
where tabschema = 'schema_name' -- put schema name here
      and type = 'T'
order by tabname

【讨论】:

以上是关于用于检索给定模式的所有表名的 DB2 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地创建一个查询,该查询将列出给定表名的列名,以及可能指向 SQL Server 或 MySQL 的连接字符串?

sql查询所有表以及表名的模糊查询

获取模式中所有表名和列名的查询[重复]

查询数据库里所有表名和字段名的语句

Db2如何查询一个scheam下所有表名包含某个字段的值

基于表名的 Postgres 表分区