2017-03-06 12 views
0

テーブルのすべてのカラムの名前を返すクエリを作成しようとしています。私はテストする1400以上のテーブルを持っていますが、100カラムのものもありますので、コロムント名を順番に調べることはできません。
サブスクリプション内でEXECUTE IMMEDIATEのようなことが可能かどうかを知りたい場合は、他の解決方法がある場合は、問題を解決してください。ここでSybase:サブクエリのEXECUTE IMMEDIATE

は私の実際のクエリです:

SELECT 
    sc.name AS columnName 
    , ('SELECT COUNT(DISTINCT ' || sc.name || ') FROM MyTableName') AS nb_distinct_row 
FROM dbo.syscolumns sc INNER JOIN sysobjects so 
    ON so.id = sc.id 
    AND so.name = 'MyTableName' 
GROUP BY sc.name 

これは良いサブクエリを返すが、私はすぐにそれを実行する方法がわかりませんか?私はこの方法をしようとしている理由ですので、 私は

, (SELECT count(distinct sc.name) from MyTableName) As nbDistinctRow 

のようなものを試してみた。しかし「sc.nameは」解釈されないと、カウント明確なリターン1。私は、Sybase IQデータベースで作業

誰もが私を助けることができますか? ありがとうございます。

答えて

0

私はこの作業を行う方法を見つけましたが、それは本当に不器用です。

CREATE OR REPLACE PROCEDURE FLA_distinctCols(in table_obj_id INT) 
RESULT (column_name VARCHAR(128), count_distinct INT) 
BEGIN 
    DECLARE err_notfound EXCEPTION FOR SQLSTATE VALUE '02000'; 
    DECLARE @tablename VARCHAR(100); 
    DECLARE @cols  VARCHAR(128); 
    DECLARE @nb_dist INT; 
    DECLARE @sql  VARCHAR(30000); 
    DECLARE @sqltemp  VARCHAR(30000); 

DECLARE tables NO SCROLL CURSOR FOR 
    SELECT 
     sc.name col 
     , ('SELECT COUNT(DISTINCT ' || sc.name || ') INTO @nb_dist FROM ' || @tablename) 
    FROM dbo.syscolumns sc INNER JOIN sysobjects so 
     ON so.id = sc.id 
     AND so.name = @tablename 
     || '%' ORDER BY sc.name 
; 


SELECT so.name INTO @tablename FROM sysobjects so WHERE so.id = table_obj_id; 

create table #tablestats (
    column_name  varchar(128) not null, 
    count_distinct  INT, 
); 

open tables WITH HOLD; 

LoopTables: loop 

    fetch next tables into @cols, @sqltemp; 

    if sqlstate = err_notfound then 
     leave LoopTables 
    else 
     EXECUTE IMMEDIATE WITH QUOTES @sqltemp; 
     set @sql= 'INSERT INTO #tablestats SELECT ''' || @cols || ''', ' || @nb_dist || ';'; 
     EXECUTE IMMEDIATE WITH QUOTES @sql; 
    end if 

end loop LoopTables; 

close tables; 

SELECT column_name, count_distinct FROM #tablestats ORDER BY count_distinct DESC; 

END 


GO 
BEGIN 
    DECLARE @tablename VARCHAR(128); 
    DECLARE @tableid INT; 
    SET @tablename = 'Mytablename'; 
    SELECT so.id INTO @tableid FROM sysobjects so WHERE so.name = @tablename; 

    SELECT * FROM FLA_distinctCols(@tableid); 

END 

他の解決策はありますか?

関連する問題