在表循环中创建列循环以计算数据库中所有字段的填充率

问题描述 投票:-1回答:1

我有2个数据库,有400多个表,我必须计算填充率。我有一个循环来计算表中所有列的填充率,但是如何为数据库中的所有表执行此操作?请帮忙!我正在使用SQL Server。

以下是循环遍历表中所有列以计算填充率的代码 -

DECLARE @Table NVARCHAR(max) = 'dbo.[TableName]'
   ,@MetaTable NVARCHAR(128) = '#TempTable'
   ,@ColumnName NVARCHAR(128)
   ,@Iterator INT = 1
   ,@SQL1 NVARCHAR(MAX)

SELECT c.NAME
  ,c.COLUMN_ID
  ,ROW_NUMBER() OVER (ORDER BY COLUMN_ID) AS RN
INTO #Cols
FROM SYS.COLUMNS c
WHERE c.OBJECT_ID = OBJECT_ID(@Table);

WHILE @Iterator <= (SELECT ISNULL(MAX(RN),0) FROM #Cols)
BEGIN
    SET @ColumnName = (SELECT NAME FROM #Cols WHERE RN = @Iterator)
     SET @SQL1 =  'INSERT INTO ' + @MetaTable + ' (Table_Name, Column_Name, 
                   Fill_Rate) '
              + 'SELECT ''' + REPLACE(@Table,'DBO.','') + ''', ''' + 
      @ColumnName + ''', 100 * CONVERT(DECIMAL(8,3), SUM(CASE WHEN [' + 
      @ColumnName + '] IS NULL THEN 0 ELSE 1 END)) / COUNT(1) AS [' + 
      @ColumnName + '_fill]' + ' FROM ' + @Table

    EXEC sp_executesql @SQL1
    SET @Iterator += 1
    END
sql sql-server loops fill rate
1个回答
1
投票

我建议使用游标来完成这个简洁的小任务:

CREATE TABLE #MetaTable (
  TABLE_SCHEMA sysname,
  TABLE_NAME sysname,
  COLUMN_NAME sysname,
  fill_rate float NULL);

DECLARE 
  @schema sysname,
  @table sysname,
  @column sysname,
  @sql nvarchar(max);

DECLARE column_cusor CURSOR FAST_FORWARD FOR
  SELECT s.name, t.name, c.name
    FROM sys.schemas s
      INNER JOIN sys.tables t ON s.schema_id = t.schema_id
        INNER JOIN sys.columns c ON t.object_id = c.object_id;

OPEN column_cusor;
FETCH NEXT FROM column_cusor INTO @schema, @table, @column;

WHILE @@FETCH_STATUS = 0
BEGIN

  SET @sql = 'SELECT ' +  QUOTENAME(@schema, '''') 
    + ', ' + QUOTENAME(@table, '''') 
    + ', ' + QUOTENAME(@column, '''') 
    + ', ' + '100.0 * SUM(CASE WHEN ' + QUOTENAME(@column)
      + ' IS NULL THEN 0 ELSE 1 END) /'
      + ' CASE WHEN COUNT(*) = 0 THEN 1 ELSE COUNT(*) END' 
    + ' FROM ' + QUOTENAME(@schema) + '.' + QUOTENAME(@table);

  INSERT INTO #MetaTable (TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, fill_rate)
  EXEC (@sql);

  FETCH NEXT FROM column_cusor INTO @schema, @table, @column;
END

CLOSE column_cusor;
DEALLOCATE column_cusor;

SELECT * FROM #MetaTable;
© www.soinside.com 2019 - 2024. All rights reserved.