SQL Serverのsys.columnsビューを活用して列名とテーブル名の関係を解明
SQL Serverで列名を含むすべてのテーブル名を見つける
SQL Serverデータベースで特定の列名を含むすべてのテーブル名を検索する方法はいくつかあります。ここでは、最も一般的な方法をいくつか紹介します。
方法
sys.columns
ビューは、データベース内のすべての列に関する情報を提供します。このビューを使用して、特定の列名を含むすべてのテーブル名を見つけることができます。
SELECT
t.name AS TableName
FROM
sys.columns c
INNER JOIN
sys.tables t ON c.object_id = t.object_id
WHERE
c.name = '列名';
INFORMATION_SCHEMA.COLUMNS
ビューは、sys.columns
ビューと同様の情報を提供します。ただし、INFORMATION_SCHEMA
ビューは、データベースのスキーマ情報にアクセスするための標準化された方法を提供するため、多くの場合、こちらの方が好まれることがあります。
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME = '列名';
動的SQLを使用する
列名が変数に格納されている場合は、動的SQLを使用してクエリを生成できます。
DECLARE @ColumnName VARCHAR(128)
SET @ColumnName = '列名'
SELECT
t.name AS TableName
FROM
sys.columns c
INNER JOIN
sys.tables t ON c.object_id = t.object_id
WHERE
c.name = @ColumnName;
フルテキスト検索を使用する
SQL Server 2008以降を使用している場合は、フルテキスト検索を使用して列名を含むすべてのテーブル名を見つけることができます。
SELECT
t.name AS TableName
FROM
sys.fulltext_tables ftt
INNER JOIN
sys.tables t ON ftt.object_id = t.object_id
WHERE
CONTAINS(ftt.fulltext_catalog, '列名');
第三者製ツールを使用する
列名を含むすべてのテーブル名を見つけるためのサードパーティ製ツールも多数あります。これらのツールは、使いやすく、追加機能を提供する場合もあります。
注意事項
- 上記のクエリは、すべてのデータベースに適用されます。ただし、一部のデータベースでは、
sys.columns
ビューやINFORMATION_SCHEMA.COLUMNS
ビューのスキーマが異なる場合があります。 - クエリを実行する前に、必要な権限を持っていることを確認してください。
- 列名が複数のテーブルに存在する場合は、クエリ結果はすべてのテーブル名を返します。
SELECT
c.name AS 列名
FROM
sys.columns c
WHERE
c.object_id = OBJECT_ID('Customers');
このコードを実行すると、次の結果が返されます。
列名
-----
CustomerID
FirstName
LastName
Email
Phone
sys.columns
ビューには、列名以外にも、列のデータ型、長さ、桁数など、多くの情報が含まれています。WHERE
句を使用して、列名だけでなく、その他の条件も指定できます。
SELECT
ステートメントは、取得する列を指定します。この例では、c.name
列のみを取得しています。FROM
ステートメントは、データを取得するテーブルを指定します。この例では、sys.columns
ビューからデータを取得しています。WHERE
ステートメントは、データを取得するための条件を指定します。この例では、c.object_id
列がCustomers
テーブルのオブジェクト ID と一致するデータのみを取得しています。
SQL Serverで列名を含むすべてのテーブル名を見つける方法
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME = '列名';
DECLARE @ColumnName VARCHAR(128)
SET @ColumnName = '列名'
SELECT
t.name AS TableName
FROM
sys.columns c
INNER JOIN
sys.tables t ON c.object_id = t.object_id
WHERE
c.name = @ColumnName;
SELECT
t.name AS TableName
FROM
sys.fulltext_tables ftt
INNER JOIN
sys.tables t ON ftt.object_id = t.object_id
WHERE
CONTAINS(ftt.fulltext_catalog, '列名');
- sys.objects ビューと sys.indexes ビューを組み合わせる
- sp_help システムストアドプロシージャを使用する
SELECT
t.name AS TableName
FROM
sys.objects t
INNER JOIN
sys.indexes i ON t.object_id = i.object_id
WHERE
i.name = '列名'
AND i.type_desc = 'IN_MEMORY';
EXEC sp_help '列名';
この方法は、列名を含むすべてのテーブル名と、その列に関する詳細情報を表示します。
以下のコードは、INFORMATION_SCHEMA.COLUMNS
ビューを使用して、Customers
テーブルに含まれるすべての列名を取得する例です。
SELECT
c.name AS 列名
FROM
INFORMATION_SCHEMA.COLUMNS c
WHERE
c.table_name = 'Customers';
列名
-----
CustomerID
FirstName
LastName
Email
Phone
sql-server