2017-03-06 132 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 

任何其他解决方案?