T SQL表中的NULL列的前10个列表

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

我正在使用SQL Server2014。我有一个包含多列的表。是否可以动态列出表中的前10列以及每列中记录为NULL的百分比?我不想对每个列名称进行硬编码。

所以结果集将像:

Column       Percent_Null
ABC           100
QWE           75
REW           65
TRW           50

我从下面开始,但是如何在列表中得到它呢?最终,需要将结果放入表格中进行报告。

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = STUFF((

SELECT ', CAST(SUM(CASE WHEN ' + Quotename(C.COLUMN_NAME) + ' IS NULL THEN 1 ELSE 0 END) * 100.00 
/@TotalCount AS INT) AS [' + C.COLUMN_NAME + ' NULL %]
'
            FROM INFORMATION_SCHEMA.COLUMNS C
            WHERE TABLE_NAME = 'tblMYTable'
                AND TABLE_SCHEMA = 'dbo'
            ORDER BY C.ORDINAL_POSITION
            FOR XML PATH('')
                ,type
            ).value('.', 'nvarchar(max)'), 1, 2, '')


            PRINT @SQL
sql-server tsql null information-schema
1个回答
0
投票

Blargh,这很丑陋,但它似乎可以满足您的要求:

DECLARE @Table sysname = N'icp_yyclient',
        @Schema sysname = N'dbo';

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = N'WITH Counts AS(' + @CRLF +
           N'    SELECT ' + 
           STUFF((SELECT N',' + @CRLF +
                         N'           (COUNT(CASE WHEN ' + QUOTENAME(C.[name]) + N' IS NULL THEN 1 END) * 1.) / COUNT(*) AS ' + QUOTENAME(c.[name] + N'_PercNULL')
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE s.name = @Schema
                    AND t.name = @Table
                  ORDER BY c.column_id
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,14,N'') + @CRLF +
           N'    FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + N')' + @CRLF +
           N'SELECT TOP(10) V.*' + @CRLF +
           N'FROM Counts C' + @CRLF +
           N'     CROSS APPLY(VALUES' +
           STUFF((SELECT N',' + @CRLF +
                         N'                       (N' + QUOTENAME(C.[name],'''') + N', C.' + QUOTENAME(c.[name] + N'_PercNULL') + N')'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE s.name = @Schema
                    AND t.name = @Table
                  ORDER BY c.column_id
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,26,N'') + N')V(ColumnName,ColumnPercNULL)' + @CRLF +
          N'ORDER BY V.ColumnPercNULL DESC;';

--SELECT @SQL; --PRINT is limited to 4,000 characters, so probably too small.

EXEC sp_executesql @SQL;
© www.soinside.com 2019 - 2024. All rights reserved.