Sybase数据库中所有表中的行计数列数

时间:2013-07-10 10:37:51

标签: sql sybase sybase-asa

我有一个数据库名称ATs。在这个数据库中有150个表。我想创建一个语句,返回数据库中所有表的行计数和列计数。

我已经为SQL SERVER 2008创建了一个存储过程,但我不知道如何为Sybase编写这个脚本。

2 个答案:

答案 0 :(得分:2)

Sybase ASA有许多系统表,为您提供有关数据库结构的信息。您感兴趣的两个表是SYSTABLE(所有表)和SYSCOLUMN(所有列)。

我尝试了这个适用于我的快速且脏的存储过程(在相当老的ASA版本8上!)。它创建一个临时表和一个游标来迭代所有表。对于每个表,表名,列数和行数都插入到临时表中,最后返回。

(提示:如果你有很多表, tablefilter 只允许返回整个数据库的一个子集。)

CREATE PROCEDURE Usr_TableStats(in par_tablefilter char(100))
RESULT (tablename varchar(255), number_of_cols int, number_of_rows int)
BEGIN

    declare err_notfound exception for sqlstate value '02000';
    declare @table_id  integer;
    declare @tablename varchar(100);
    declare @cols      integer;
    declare @sql       varchar(300);

    declare tables no scroll cursor for select table_id, table_name from sys.systable where table_type = 'BASE' and table_name like par_tablefilter || '%' order by table_name;

    create table #tablestats (
        tablename       varchar(100) not null,
        number_of_cols  int not null default 0,
        number_of_rows  int not null default 0
    );

    open tables;

    LoopTables: loop

        fetch next tables into @table_id, @tablename;

        if sqlstate = err_notfound then
            leave LoopTables
        else
            SELECT COUNT(column_id) INTO @cols FROM SYSCOLUMN WHERE table_id = @table_id;
            set @sql= 'INSERT INTO #tablestats SELECT ''' || @tablename || ''', ' || @cols || ', COUNT(*) FROM ' || @tablename || ';';
            EXECUTE IMMEDIATE WITH QUOTES @sql;
        end if

    end loop LoopTables;

    close tables;

    SELECT tablename, number_of_cols, number_of_rows FROM #tablestats;

END

在iSQL中调用它:

CALL Usr_TableStats('%'); -- all tables
CALL Usr_TableStats('ADDRESS%'); -- only tables starting with ADDRESS

答案 1 :(得分:0)

sys.systable和sys.syscolumn应该为您提供信息:

   Select st.table_name, 
    st.count as row_count,
    col_count = (SELECT count(*) FROM sys.syscolumn where table_id = st.table_id)
    from SYS.SYSTABLE st where st.creator <> 0 and st.count > 0
    order by st.table_name