需要从一组表中过滤掉sql服务器中具有null,0或空值的所有列



我有一堆大约 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''以及NULLCOUNT()不会计算带有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)循环中的所有表应该相当容易。

最新更新