2010-11-26 12 views
2

私は8列と5000+行のテーブルを持っています。各行のデータを持つ列の数をカウントします。

私は、各行に対してNULLでない列の数を数えるt-sql selectを書くのに助けが必要でした。

+0

**有効なTSQLであるかどうかにかかわらず、** ** TSQL(Transact SQL)**または任意のMS SQL Serverコードが特に必要ですか? – DVK

答えて

1

は、あなたのテーブルの名前で「カタログ」の2つの発生を置き換え、これを試してみてください。これは、既定の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インジェクション攻撃を受けやすいことに注意してください。

+0

これは有効なtsqlですか(私はOPのタグを外しています)?私はこれがMSSQLServerだと思っただけですか? – DVK

+0

@DVK:そうですね、デフォルトのReportServerデータベース –

+0

を使用してSQL Server 2008 Dev Editionでテストしましたが、少し変わっていましたが、トリックは –

2

ピュアの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 
+2

あなたはいくつかの 'いつ? @ダニエル - yep。 –

+1

ダー。一定。 thx – DVK

関連する問題