2010-11-26 69 views
2

我有8列,5000+行的表。计数每行有数据的列数

我需要帮助写t-sql选择,将计数每行的非空列数。

+0

您是否想特别** TSQL(Transact SQL)**或者只是任何MS SQL Server代码,无论它是否是有效的TSQL? – DVK 2010-11-26 17:29:23

回答

1

试试这个,更换的“目录”与您表的名称出现的两个。这已经在默认的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注入攻击,如果你不能信任的列名的来源(例如,如果最终用户可以使列名与在其控制下创建)。

2

纯的Transact SQL(不使用动态SQL调用,它不是TSQL的一部分):

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 
+2

你错过了一些'WHEN`s! – 2010-11-26 16:05:06

+1

@丹尼尔 - 是的。咄。固定。 thx – DVK 2010-11-26 16:07:59