2013-07-10 64 views
0

我有一個數據庫名稱AT。在這個數據庫150表。我想創建一個語句來返回數據庫中所有表的行數和列數。Sybase數據庫中所有表中的行數列數

我已經創建了一個存儲過程對於SQL SERVER 2008,但我不知道如何爲Sybase編寫此腳本。

回答

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 
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 
相關問題