SQL Server システム カタログに対するクエリ

一連の特定のテーブルとビューを操作するようにハードコードされていない動的アプリケーションには、接続先のデータベース内のオブジェクトの構造と属性を判断するためのメカニズムが備わっている必要があります。このようなアプリケーションでは、たとえば次のような情報が必要になります。

  • データベース内のテーブルとビューの数と名前。

  • テーブル内またはビュー内の列数、および各列の名前、データ型、小数点以下桁数、有効桁数。

  • テーブルに定義されている制約。

  • テーブルに定義されているインデックスとキー。

システム カタログにより、SQL Server データベースに関する上記の情報が提供されます。SQL Server システム カタログの中核となるのは、SQL Server のインスタンスのオブジェクトを記述するメタデータを表示する一連のビューです。メタデータとは、システム内のオブジェクトの属性を記述するデータのことです。SQL Server ベースのアプリケーションでは、次の機能を使用してシステム カタログ内の情報にアクセスできます。

  • カタログ ビュー。このアクセス方法をお勧めします。

  • 情報スキーマ ビュー。

  • OLE DB スキーマ行セット。

  • ODBC カタログ関数。

  • システム ストアド プロシージャとシステム関数。

カタログ ビュー

カタログ ビューにより、サーバー上のすべてのデータベースに格納されているメタデータにアクセスできます。

注意

カタログ ビューを使用しても、レプリケーション、SQL Server エージェント、またはバックアップ メタデータにアクセスすることはできません。

カタログ ビューの使用によるメタデータへのアクセスが推奨されている理由は、次のとおりです。

  • すべてのメタデータがカタログ ビューとして利用できます。

  • カタログ ビューには、どのカタログ テーブルの実装にも依存しない形式でメタデータが表示されます。そのため、基になるカタログ テーブルが変更されてもカタログ ビューは影響を受けません。

  • カタログ ビューは、中核的なサーバー メタデータにアクセスするのに最も効率的な方法です。

  • カタログ ビューはカタログ メタデータに対する一般的なインターフェイスで、カスタマイズされた形式のカタログ メタデータを取得、変換、および表示するのに最も直接的な方法です。

  • カタログ ビューとビューの列名には、わかりやすい名前が付けられています。このため、クエリ対象のメタデータに対応する機能に関して、中程度の知識しか持たないユーザーも、期待どおりのクエリ結果を得ることができます。

たとえば、次のクエリでは、sys.objects カタログ ビューを使用して、過去 10 日間に変更されたすべてのデータベース オブジェクトを返します。

SELECT name AS object_name 
  ,SCHEMA_NAME(schema_id) AS schema_name
  ,type_desc
  ,create_date
  ,modify_date
FROM sys.objects
WHERE modify_date > GETDATE() - 10
ORDER BY modify_date;

カタログ ビューを使用したシステム カタログに対するクエリのその他の例については、「SQL Server システム カタログに対するクエリに関してよく寄せられる質問」を参照してください。

重要な注意事項重要

今後の Microsoft SQL Server のリリースでは、列のリストの末尾に列を追加することにより、システム カタログ ビューの定義が拡張される可能性があります。返される列の数が変化し、アプリケーションが機能しなくなる可能性があるため、製品コードでは SELECT * FROM sys.catalog_view_name という構文を使用しないことをお勧めします。

情報スキーマ ビュー

情報スキーマ ビューは ISO 標準のカタログ ビューの定義に基づいています。情報スキーマ ビューには、どのカタログ テーブルの実装にも依存しない形式でカタログ情報が表示されるので、基になるカタログ テーブルが変更されても影響を受けません。情報スキーマ ビューを使用するアプリケーションは、ISO に準拠する異種データベース システム間で移植可能です。詳細については、「情報スキーマ ビュー (Transact-SQL)」を参照してください。

注意

情報スキーマ ビューには、SQL Server 2008 に固有のメタデータは含まれません。

次の例では、INFORMATION_SCHEMA.COLUMNS ビューをクエリして、AdventureWorks2008R2 データベース内の Person テーブルのすべての列を返します。

SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person';

互換性ビュー

以前のバージョンの SQL Server の多くのシステム テーブルは、一連のビューとして実装されるようになりました。これらのビューは互換性ビューと呼ばれ、旧バージョンとの互換性のためだけに用意されています。互換性ビューには、SQL Server 2000 で使用できるのと同じメタデータが表示されます。ただし、SQL Server 2005 以降に導入された機能に関連するメタデータは表示されません。したがって、Service Broker やパーティションなどの新機能を使用するときは、カタログ ビューを使用するように切り替える必要があります。これは、システム テーブルをカタログ ビューにアップグレードするための妥当な理由です。カタログ ビューにアップグレードする他の理由として、ユーザー ID や型 ID を格納する互換性ビューの列から、NULL またはトリガー算術オーバーフローが返されることが挙げられます。これは、SQL Server 2005 以降では、32,767 を超えるユーザーおよびデータ型を作成できるためです。たとえば、32,768 人のユーザーを作成してから SELECT * FROM sys.sysusers というクエリを実行すると、ARITHABORT が ON に設定されている場合は、クエリが算術オーバーフロー エラーで失敗します。ARITHABORT が OFF に設定されている場合は、uid 列から NULL が返されます。

これらの問題を回避するには、数が増加したユーザー ID や型 ID を処理できる新しいカタログ ビューを使用するようにアップグレードすることをお勧めします。

OLE DB スキーマ行セット

OLE DB 仕様には、カタログ情報を含む一連のスキーマ行セットを公開する IDBSchemaRowset インターフェイスが定義されています。OLE DB スキーマ行セットは、さまざまな OLE DB プロバイダーによってサポートされているカタログ情報を表示する標準的な方法です。行セットは基になるカタログ テーブルの構造とは無関係です。詳細については、「スキーマ行セットのサポート (OLE DB)」を参照してください。

Microsoft SQL Server Native Client OLE DB プロバイダーでは、分散クエリで使用されるリンク サーバーのカタログ情報を報告する IDBSchemaRowset の拡張機能がサポートされています。詳細については、「LINKEDSERVERS 行セット (OLE DB)」を参照してください。

ODBC カタログ関数

ODBC 仕様には、カタログ情報を含む結果セットを返す一連のカタログ関数が定義されています。これらの関数は、さまざまな ODBC ドライバーでサポートされているカタログ情報を表示する標準的な方法です。結果セットは基になるカタログ テーブルの構造とは無関係です。

SQL Server Native Client ODBC ドライバーでは、分散クエリで使用されるリンク サーバーのカタログ情報を報告する 2 つのドライバー固有の関数がサポートされています。詳細については、「カタログ関数の使用」を参照してください。

システム ストアド プロシージャとシステム関数

Transact-SQL には、カタログ情報を返すサーバー システム ストアド プロシージャとシステム関数が定義されています。これらのストアド プロシージャと関数は SQL Server 固有のものですが、基になるシステム カタログ テーブルの構造がユーザーに影響することはありません。詳細については、「メタデータ関数 (Transact-SQL)」および「システム ストアド プロシージャ (Transact-SQL)」を参照してください。