2017-03-06 18 views
0

테이블의 모든 열 이름을 반환하는 쿼리를 만들고 각 열의 개수를 구별하려고합니다. 테스트 할 1400 개 이상의 테이블이 있고 일부는 100 개의 컬럼으로 구성되어 있기 때문에 콜론 이름을 하나씩 뽑아 내고 있다고 상상할 수는 없습니다.
카운트 disctinct 부분에 문제가 있습니다. 서브 쿼리에서 EXECUTE IMMEDIATE와 같은 작업을 수행 할 수 있는지 알고 싶습니다. 그렇지 않은 경우 다른 솔루션이 있는지 알고 싶습니까?Sybase : 서브 쿼리에 대한 실행 즉시 처리

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 

이 좋은 하위 쿼리를 반환하지만 immediatly을 실행하는 방법을 모른다 : 여기

내 실제 쿼리입니다? 나는이 방법을 시도하고 그 이유는, 그래서 나는

, (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 

다른 해결책이 있습니까?