2017-05-06 3 views
-3

데이터베이스에서 얼마나 많은 테이블에 데이터가 있는지 그리고 얼마나 많은 테이블이 비어 있는지 확인하려면 SQL 스크립트가 필요합니까 ??내가 얼마나 많은 테이블에 데이터가 데이터베이스에 존재하는지 알고 싶습니다

+0

질문의 질을 높이려면 관련 테이블을 나열하십시오. 시도한 코드와 오류 메시지의 전문을 보여주십시오. 좋은 질문을하는 방법에 대한 자세한 정보는 http://stackoverflow.com/help/how-to-ask를 읽으십시오. – toonice

+0

howmany 테이블에 databse의 데이터가 있어야합니다. morethan 100 테이블이있는 데이터베이스가 있지만 그 테이블의 데이터가 없습니다. 얼마나 많은 테이블에 데이터가 들어 있는지 알 필요가 있습니다. – Mulwaffer

+0

표준 보고서를 사용하십시오. SSMS, "톱 xxx 테이블에 의한 디스크 사용" –

답변

0

이 하나를 시도 : 코멘트에 @ 제임스 Z에 의해 제안

USE dbName 
SELECT COUNT(*) from information_schema.tables 
WHERE table_type = 'base table' 
+0

이것은 내가 기대하는 바가 아닙니다. – Mulwaffer

0

당신은 SSMS의 표준 보고서를 사용할 수 있습니다. > 표준 보고서는 - -
오른쪽

를보고 Database 인스턴스를 클릭> 테이블이 디스크 사용량이

enter image description here

0

... 다음 시도하십시오

CREATE PROCEDURE EmptyFullTableCounter AS 
BEGIN 
    DECLARE @fldNameValue VARCHAR(64); 
    DECLARE @sqlStatementString varchar(200); 

    DECLARE @loopIndex INT = 1; 
    DECLARE @recordCount INT; 

    DROP TABLE IF EXISTS tempTblTableNames; 

    CREATE TABLE tempTblTableNames 
    (
     fldName VARCHAR(64), 
     fldCount INT 
    ); 

    INSERT INTO tempTblTableNames (fldName, 
            fldCount) 
    SELECT table_name, 
      0 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE table_type = 'BASE TABLE' 
     AND table_catalog = 'UserAccessAccounts001' 
     AND table_name != 'tempTblTableNames'; 

    SET @recordCount = (SELECT COUNT(*) 
         FROM tempTblTableNames); 

    WHILE @loopIndex <= @recordCount 
     BEGIN 
      SET @fldNameValue = (SELECT fldName 
            FROM (SELECT fldName, 
               ROW_NUMBER() OVER (ORDER BY fldName) AS recordNumber 
             FROM (SELECT fldName 
               FROM tempTblTableNames 
              ) AS fldNamesFinder 
             ) AS fldNamesWithRowNumber 
            WHERE recordNumber = @loopIndex); 

      SET @sqlStatementString = 'UPDATE tempTblTableNames ' + 
             'SET fldCount = (SELECT COUNT(*) ' + 
             '     FROM ' + 
             @fldNameValue + 
             ') ' + 
             'WHERE fldName = ''' + 
             @fldNameValue + 
             ''';'; 

      EXEC (@sqlStatementString); 

      SET @loopIndex = @loopIndex + 1; 
     END 

    SELECT SUM(IIF(fldCount > 0, 1, 0)) AS Haves, 
      SUM(IIF(fldCount = 0, 1, 0)) AS HaveNots 
    FROM tempTblTableNames; 

    DROP TABLE tempTblTableNames; 
END 

이 절차 별 테이블을 생성하여 TS는

INSERT INTO tempTblTableNames (fldName, 
           fldCount) 
SELECT table_name, 
     0 
FROM INFORMATION_SCHEMA.TABLES 
WHERE table_type = 'BASE TABLE' 
    AND table_catalog = 'UserAccessAccounts001' 
    AND table_name != 'tempTblTableNames'; 

위의 문은 테이블의 우리의 목록에서 tempTblTableNames를 제외 있습니다 ... 다음 다음 문을 사용하여 채 웁니다 각 테이블의 이름을 유지합니다.

그러면 절차는 변수 @recordCount에 총 레코드 수를 저장합니다. 이 값은 각 테이블 이름을 tempTblTableNames에서 추출하고 tempTblTableNames에 해당 테이블 이름의 관련 개수를 업데이트하는 명령문을 구성하는 WHILE 루프의 센티널 값으로 사용됩니다. 그런 다음이 명령문이 실행되고 루프 인덱스가 반복됩니다. 루프가 최종 SELECT 문을 완료하면

는 기록이 테이블의 수와 기록이없는 테이블의 수를 계산 IIF()와 함께 SUM()를 사용하는 실행된다.

질문이나 의견이 있으시면 언제든지 그에 따라 설명문을 게시하십시오.

관련 문제