我有8列和5000多行的表。
我需要帮助编写t-sql select,它会为每一行计算非空列数。
答案 0 :(得分:2)
Pure Transact SQL(不使用不属于TSQL的动态SQL调用):
SELECT
CASE WHEN c1 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c2 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c3 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c4 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c5 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c6 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c7 IS NULL THEN 0 ELSE 1 END
+ CASE WHEN c8 IS NULL THEN 0 ELSE 1 END
FROM T
答案 1 :(得分:1)
尝试此操作,将两次出现的“Catalog”替换为您的表名。已在默认ReportServer数据库中的SQL Server 2008 R2 Dev Edition上成功测试过。
DECLARE @Sql nvarchar(max)
SET @Sql = 'SELECT 0'
SELECT
@Sql = @Sql + '
+ CASE WHEN [' + [sys].[columns].[name] + '] IS NULL THEN 1 ELSE 0 END'
FROM [sys].[columns]
WHERE [sys].[columns].[object_id] = OBJECT_ID('Catalog')
AND [sys].[columns].is_nullable = 1
SET @Sql = @Sql + '
AS [NullValuesCount] FROM [Catalog]'
PRINT @Sql
EXEC sp_executesql @Sql
请注意,如果您不能信任列名的来源,则此方法容易受到SQL注入攻击(例如,如果最终用户可以导致使用其控制下的名称创建列)。