1

データベース名 ATs があります。このデータベースには 150 のテーブルがあります。データベース上のすべてのテーブルの行数と列数を返すステートメントを作成したいと考えています。

SQL SERVER 2008 用のストア プロシージャを作成しましたが、Sybase 用にこのスクリプトを作成する方法がわかりません。

4

2 に答える 2

2

Sybase ASA には、データベースの構造に関する情報を提供する多数のシステム テーブルがあります。関心のある 2 つのテーブルは、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 に答える