列名を検索するためのSELECTソリューション
データベースの構造は知っていても、テーブルや列の完全な名前は思い出せないということもあるでしょう。そんなときには、SQL Server 2000で次のSELECTステートメントを実行してください。
SELECT c.Table_Schema, c.Table_name, c.Column_name FROM INFORMATION_SCHEMA.COLUMNS c INNER JOIN INFORMATION_SCHEMA.TABLES t ON c.Table_schema = t.Table_SCHEMA AND c.Table_name = t.Table_name WHERE TABLE_TYPE = 'BASE TABLE' AND c.Column_name LIKE <検索文字列>
上記のスクリプトはSQL Server 2000、2005、および2008で機能します。次のスクリプトは2005および2008の新しいスキーマテーブルをベースにしており、前方互換性があります。
SELECT t.name AS TableName,
sc.name AS SchemaName,
c.name AS ColumnName,
types.name AS TypeName,
st.name AS TypeSchemaName,
t.type AS type
FROM sys.all_columns c INNER JOIN sys.all_objects t WITH (NOLOCK) ON c.object_id=t.object_id
LEFT JOIN sys.schemas sc WITH (NOLOCK) ON t.schema_id=sc.schema_id
LEFT JOIN sys.types types WITH (NOLOCK) ON c.user_type_id=types.user_type_id
LEFT JOIN sys.schemas st WITH (NOLOCK) ON st.schema_id=types.schema_id
WHERE t.type IN ('U') AND c.Column_name LIKE <検索文字列>
ORDER BY c.object_id, c.column_id
完全な名前を思い出せないテーブルや列をSQL Serverデータベースから検索するには、次のようにしてSELECTステートメントを実行します。
SELECT c.Table_Schema, c.Table_name, c.Column_name FROM INFORMATION_SCHEMA.COLUMNS c INNER JOIN INFORMATION_SCHEMA.TABLES t ON c.Table_schema = t.Table_SCHEMA AND c.Table_name = t.Table_name WHERE TABLE_TYPE = 'BASE TABLE' AND c.Column_name LIKE '%order%'
図2は、Northwindに対して上記のステートメントを実行した結果です。
ご覧のように、SELECTは「order」という文字列が含まれている列名のインスタンスをいくつか返しています。BASE TABLEはユーザーが作成したテーブルのことであり、システムテーブルではありません(information_schemaテーブル内では、テーブルはこう定義されています)。
おわりに
詳細がわかっているエンティティの検索は簡単ですが、テーブルや列の名前がわからないときの検索はもっと手間がかかります。この記事で紹介したストアドプロシージャを使用すると、構造がわからないテーブルから特定の値を検索できます。また、SELECTステートメントを使用すると、パターンやキーワードに一致する名前の列を突き止めることができます。どちらのソリューションもぜひ装備したい有用なツールです。

