计算每行包含数据的列数

时间:2010-11-26 15:53:04

标签: tsql sql-server-2008

我有8列和5000多行的表。

我需要帮助编写t-sql select,它会为每一行计算非空列数。

2 个答案:

答案 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注入攻击(例如,如果最终用户可以导致使用其控制下的名称创建列)。