我有以下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的总数作为百分比?
谢谢
答案 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