2017-03-06 130 views
0

我試圖做一個查詢,返回一個表的所有列的名稱,併爲每個列的計數不同。我有超過1400張表格進行測試,其中一些列有100列,所以我無法一個一個地想到提示colomn的名字。
我有計數disctinct部分的問題,我想知道是否有可能在子查詢中執行像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 

任何其他解決方案?