我有一堆大约 50 个表,我试图从所有这些表中找出一种方法来过滤所有具有 0 null 或空值的列。不确定sys.tables或Information_schema.tables是否具有任何此类功能来满足此要求。像这里一样,最后一列的所有行都有空值,因此对于我在查询中提供的每个表,我需要所有带有表名的此类列
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'db_name'
[AND table_name LIKE 'wild']
SHOW TABLES
FROM db_name
[LIKE 'wild']
以下命令将使用NULLIF
两次来处理0
和''
以及NULL
。COUNT()
不会计算带有NULL
的行。如果计数返回0
,则此列中没有其他内容:
SELECT COUNT(NULLIF(NULLIF(CAST(tbl.SomeField AS NVARCHAR(MAX)),''),'0'))
FROM SomeTable AS tbl;
好的部分是:您不必为所有列键入此内容...以下代码将为给定表的所有列生成此命令,并使用EXEC()
执行该命令:
DECLARE @cmd NVARCHAR(MAX);
DECLARE @tableName NVARCHAR(MAX)='SomeTable'
SELECT @cmd='SELECT '
+ STUFF(
(
SELECT ',COUNT(NULLIF(NULLIF(CAST(' + QUOTENAME(COLUMN_NAME) + ' AS NVARCHAR(MAX)),''''),''0''))'
+ ' AS ' + QUOTENAME('CountOf_' + COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=@tableName
FOR XML PATH(''),TYPE).value(N'.',N'nvarchar(max)'),1,1,'')
+ ' FROM ' + QUOTENAME(@tableName) + ';'
PRINT @cmd; --check the output in a query window
EXEC(@cmd);
您可能希望使用WHERE
子句将其简化为具有特定类型的列...
进一步动态处理(CURSOR
)循环中的所有表应该相当容易。