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'

したがって、出力は次のようになります。

EntValue    2
TrailingPE  1
ForwardPE   11

各整数は、テーブルのその列の0値のカウントです。

前もって感謝します...

4

1 に答える 1

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) + N' =  SUM(CASE WHEN ' 
  + QUOTENAME(name) + N' = 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 = N'SELECT ' + @sql + N' TotalRows = COUNT(*) 
  FROM ' + @table + N';';

PRINT @sql;
--EXEC sys.sp_executesql @sql;

これにより、非常にコストのかかるクエリが発生するように見えますが、実際には、クラスター化インデックススキャンを実行するだけです(SELECT * 数学を少し追加して、実行するのとほとんど同じです)。

また、INFORMATION_SCHEMAビューには近づかないでください。彼らは健康ではありません:

于 2012-05-01T20:34:50.270 に答える