null百分比动态sql

时间:2016-11-29 11:26:24

标签: sql sql-server

我有以下sql:

SET NOCOUNT ON

DECLARE @Schema NVARCHAR(100) = 'dbo'
DECLARE @Table NVARCHAR(100) = NULL
DECLARE @sql NVARCHAR(MAX) =''

IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL 
    DROP TABLE #Nulls

CREATE TABLE #Nulls 
(
     TableName sysname, 
     ColumnName sysname, 
     ColumnPosition int, 
     NullCount int, 
     NonNullCount int
)

select @sql += 'select TableName = ''' + quotename(table_schema) + '.' + 
quotename(table_name) + ''' , ColumnName = ''' + quotename(column_name) 
+ ''' , ColumnPosition = ''' + convert(varchar(5) , ordinal_position) 
+ ''' , CountNulls = sum(case when ' + quotename(column_name) + ' is null  
then 1 else 0 end) , CountnonNulls = count(' + quotename(column_name) + ') 
from ' + quotename(table_schema) + '.' + quotename(table_name) + ';' + char(10)

FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table)

INSERT INTO #Nulls 
    EXEC sp_executesql @sql

SELECT * 
FROM #Nulls

但是,我希望第一列中的数据库名称,第二列中的模式名称,并且不像当前那样加入,最后在结束列中显示null的总数作为百分比?

谢谢

2 个答案:

答案 0 :(得分:0)

SET NOCOUNT ON
DECLARE @Schema NVARCHAR(100) = 'dbo'
DECLARE @Table NVARCHAR(100) = NULL
DECLARE @sql NVARCHAR(MAX) =''
IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL DROP TABLE #Nulls

CREATE TABLE #Nulls (DataBaseName sysname,SchemaName sysname,TableName sysname, ColumnName sysname, 
ColumnPosition     int 
, NullCount int , NonNullCount int)

--select * from INFORMATION_SCHEMA.COLUMNS

select @sql += 'select DBName = '''+ quotename(TABLE_CATALOG) 
+''',SchemaName = '''+ quotename(table_schema) +''',TableName = '''
+ quotename(table_name) + ''' , ColumnName = ''' + quotename(column_name) 
+ ''' , ColumnPosition = ''' + convert(varchar(5) , ordinal_position) 
+ ''' , CountNulls = sum(case when ' + quotename(column_name) + ' is null  
then 1 else 0 end) , CountnonNulls = count(' + quotename(column_name) + ') 
from ' + quotename(table_schema) + '.' + quotename(table_name) + ';' + char(10)

FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table)

INSERT INTO #Nulls 
EXEC sp_executesql @sql

SELECT *,NullCntPercentage = (case when isnull(NullCount,0)=0 then 0 else cast((NullCount*100.0/(NullCount+NonNullCount)) as decimal(15,2)) end) 
,NonNullCntPercentage = (case when NonNullCount=0 then 0 else cast((NonNullCount*100.0/(NullCount+NonNullCount)) as decimal(15,2)) end)
FROM #Nulls order by TableName,ColumnPosition

以下是输出

DataBaseName    SchemaName  TableName   ColumnName  ColumnPosition  NullCount   NonNullCount    NullCntPercentage   NonNullCntPercentage
[MyDB]           [dbo]       [EmpDtl1]     [EmpId]      1              1             6            14.29                85.71
[MyDB]           [dbo]       [EmpDtl1]   [EmpName]      2              1             6            14.29                85.71

答案 1 :(得分:0)

如果您希望代码收集有关服务器上所有数据库中的表的数据,则需要分别遍历每个数据库:

SET NOCOUNT ON

DECLARE @Schema NVARCHAR(100) = 'dbo'
DECLARE @Table NVARCHAR(100) = NULL
DECLARE @sql NVARCHAR(MAX) =''

IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL 
    DROP TABLE #Nulls

CREATE TABLE #Nulls 
(
        DbName sysname,
        SchemaName sysname,
        TableName sysname, 
        ColumnName sysname, 
        ColumnPosition int, 
        NullCount int, 
        NonNullCount int
)

;
DECLARE @db_name VARCHAR(50) -- database name
DECLARE db_cursor CURSOR FOR
        SELECT name
        FROM msdb.sys.databases
        -- Iterate over all databases, except for these
        WHERE name NOT IN ('master','model','msdb','tempdb')

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db_name

WHILE @@FETCH_STATUS = 0
BEGIN

        SET @sql = 'USE ' + QUOTENAME(@db_name)
        EXEC sp_executesql @sql

        select @sql += 'select DbName = ''' + quotename(@db_name)
        + ''',  SchemaName = ''' + quotename(table_schema)
        + ''',  TableName = ''' + quotename(table_schema) + '.' + quotename(table_name)
        + ''' , ColumnName = ''' + quotename(column_name) 
        + ''' , ColumnPosition = ''' + convert(varchar(5) , ordinal_position) 
        + ''' , CountNulls = sum(case when ' + quotename(column_name) + ' is null  
        then 1 else 0 end) , CountnonNulls = count(' + quotename(column_name) + ') 
        from ' + quotename(table_schema) + '.' + quotename(table_name) + ';' + char(10)

        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE (@Table IS NULL OR TABLE_NAME = @Table)

        INSERT INTO #Nulls 
            EXEC sp_executesql @sql

        FETCH NEXT FROM db_cursor INTO @db_name
END


CLOSE db_cursor  
DEALLOCATE db_cursor


SELECT * 
FROM #Nulls