1

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

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

4

2 回答 2

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
于 2013-07-11T07:55:20.223 回答
1

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
于 2014-05-05T06:11:06.313 回答