2012-05-01 5 views
0

私はテーブルを設定する途中ですが、各列の0の値の数を調べたいと思います。私はこれまでにシステムビューを使ったことがありません...私はこれのようなことをすることができますか? (これは、入力されたとして、当然のことながら、それは意図を伝えるためだけの仕事しません):システムビューを使用して、テーブル内のすべての列の集計値を取得できますか?

SELECT t.COLUMN_NAME, (SELECT COUNT(ID) FROM tblKeyStatistics t2 WHERE 
t2.ColumnName = t.COLUMN_NAME AND t2.ColumnName = 0) AS CountOf0 
FROM INFORMATION_SCHEMA.COLUMNS t 
WHERE TABLE_NAME = 'tblKeyStatistics' 

ので、出力は次のようになります。整数のそれぞれは、0値のカウントされた状態で

EntValue 2 
TrailingPE 1 
ForwardPE 11 

テーブルのその列に表示されます。

事前のおかげで...

答えて

3

いいえ、システムビュー/のDMVは、個々の列の値はnull/NOT NULLステータスを追跡していないが、(私は疑って)いくつかの文書化されていない場所に保存されているがされていない限り。この情報を取得するには、実際のオブジェクトに対してクエリを実行する必要があります。もちろん、より自動化された方法でクエリを生成することができます:それは非常に高価なクエリになりますように

DECLARE @table SYSNAME = N'dbo.tblKeyStatistics'; -- please use schema prefix 

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += CHAR(13) + CHAR(10) 
    + QUOTENAME(name) + ' = SUM(CASE WHEN ' 
    + QUOTENAME(name) + ' = 0 THEN 1 ELSE 0 END),' 
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@table) 
    -- make sure you only get numeric types: 
    AND system_type_id IN (48, 52, 56, 59, 60, 62, 104, 106, 108, 122, 127); 

SELECT @sql = 'SELECT ' + @sql + ' TotalRows = COUNT(*) 
    FROM ' + @table + ';'; 

PRINT @sql; 
--EXEC sp_executesql @sql; 

これは見えますが、実際にそれだけでSELECT *のような(多くはどうなるクラスタ化インデックスのスキャンを行い、少し追加された数学で)。

また、INFORMATION_SCHEMAビューから離れてください。彼らは健康的ではありません。

http://blog.sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx

+0

非常にクールな、あまりにも速い感謝..。 – StatsViaCsh

+0

あなたの記事へのリンクをありがとう。あなたはINFORMATION_SCHEMAのビューが不完全であることを非常に明確にしました。私はそれについて完全に同意します。たとえ自分がINFORMATION_SCHEMAに比較的新しいと思っていたとしても、私はそれほど疑っていました。私が追加しなければならないことは、このような列の(非)存在をチェックするには不健全なものは何も見えないと言っています。 ... '。 'sys.columns'を使うよりも自然なことです。 (そして、私はINFORMATION_SCHEMAについて学ぶ前に後者の方法にかなり慣れていました。) –

+0

おっと、 '.COLUMNS'を見逃しました。もちろん、 'FROM INFORMATION_SCHEMA.COLUMNS'を読み込んでいるはずです。 –