2010-11-26 45 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