2014-02-05 3 views
0

여기 내 문제가 있습니다.무결성 감사

각 데이터베이스의 각 테이블에서 고유 한 값을 모두 계산해야합니다.

Example: 
[db 1] 
[table 1] 
[column 1] count() 
[column 1] distinct() 
[column 1] count() 
[column 1] distinct() 
[column 2] count() 
[column 2] distinct() etc 

[db 2] 
[table 1] 
[column 1] count() 
[column 1] distinct() 
[column 2] count() 
[column 2] distinct() etc 

는 지금은 지금까지이 :

DECLARE @TableName VARCHAR (MAX) =  'sales' 

SELECT DISTINCT 
    'SELECT ' 
    + RIGHT (ColumnList, LEN (ColumnList) - 1) 
    + ' FROM ' 
    + Table_Name +' group BY '+ (ColumnList)',' 
    FROM INFORMATION_SCHEMA.COLUMNS COL1 
    CROSS APPLY (SELECT ', COUNT (' + COLUMN_NAME + ')'+ ','+COLUMN_NAME 
        FROM INFORMATION_SCHEMA.COLUMNS COL2 
       WHERE COL1.TABLE_NAME = COL2.TABLE_NAME 
       FOR XML PATH ('')) TableColumns (ColumnList) 

WHERE 1 = 1 AND COL1.TABLE_NAME = @TableName 

그래서 난 그냥으로 그룹과 도움이 필요합니다.

+0

환경에서 bash/ksh 또는 python과 같은 상위 레벨 스크립팅은 얼마나 열려 있습니까? – gbtimmon

+0

아주 열려 있습니다. 나는 내 컴퓨터에서 이걸 실행하고있다. – Ninety3cents

+0

그래서 각 테이블의 각 열에 대해 모든 행의 count()를 원하고 모든 데이터베이스에서 각 테이블의 각 열에 대해 모든 고유 행의 count()를 원하십니까? –

답변

0

Ohh noo @SaUce가 무서운 커서를 다시 사용했습니다.

음이 솔루션의 일부에 불과이며이없는 가장 중요한 부분, 그러나 여기에서 어떻게 그것을 할 것 입니다. 다음 코드는 당신이 당신이 그 COUNT를 고려해야 아무리 당신이 그것을 어떻게 각각의 DB

을 위해 그것을 실행하지하는 방법을 파악해야 현재 데이터베이스의 각 테이블에서 모든 행의 COUNT()COUNT(DISTINCT Column)를 반환합니다

(*)와 COUNT (DISTINCT)는 값 비싼 연산이므로 마지막으로 실행 한 결과를 저장하는 것이 가장 좋습니다. 데이터베이스 크기에 따라 완료하는 데 몇 시간 (며칠)이 걸릴 수 있습니다.

IF OBJECT_ID('tempdb.dbo.#tempTable') IS NOT NULL 
    DROP TABLE #tempTable; 

CREATE TABLE #tempTable 
    (
    TableName VARCHAR(250) 
    ,ColumnName VARCHAR(250) 
    ,TotalCount BIGINT 
    ,DistinctCount BIGINT 
    ) 

DECLARE @column_name VARCHAR(250) 
    ,@table_name VARCHAR(150) 
    ,@SQLStatement NVARCHAR(500) 

DECLARE table_cursor CURSOR 
FOR 
    SELECT DISTINCT OBJECT_NAME(object_id) 
     FROM sys.tables t 
     ORDER BY 1 

OPEN table_Cursor 
FETCH NEXT FROM table_cursor INTO @table_name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

     DECLARE column_cursor CURSOR 
     FOR 
      SELECT DISTINCT name 
       FROM sys.columns c 
       WHERE OBJECT_NAME(object_id) = @table_name 

     OPEN column_cursor 

     FETCH NEXT FROM column_cursor 
     INTO @column_name 

     WHILE @@FETCH_STATUS = 0 
      BEGIN 
       SET @SQLStatement = N' 
       INSERT INTO #tempTable 
       SELECT ''' + @table_name + ''' 
       ,''' + @column_name + ''' 
       ,COUNT(*) 
       ,COUNT(Distinct ' + @column_name + ') 
       FROM ' + @table_name + ' WITH(NOLOCK)' 

       --PRINT @SQLStatement 

       EXECUTE sp_executesql 
        @SQLStatement 

       FETCH NEXT FROM column_cursor INTO @column_name 
      END 
     CLOSE column_cursor; 
     DEALLOCATE column_cursor; 

     FETCH NEXT FROM table_cursor INTO @table_name 
    END 
CLOSE table_cursor 
DEALLOCATE table_cursor 

SELECT * 
    FROM #tempTable