INFORMATION_SCHEMA.TABLES ビューを使用する
SQL Server で T-SQL を使用して、現在のデータベース内のすべてのテーブルのリストを取得するには、いくつかの方法があります。最も一般的に使用される方法は、sys.objects
カタログビューをクエリする方法です。
方法 1: sys.objects カタログビューを使用する
sys.objects
カタログビューには、データベース内のすべてのオブジェクトに関する情報が含まれています。 テーブル、ビュー、プロシージャ、関数など、さまざまな種類のオブジェクトに関する情報が含まれています。
すべてのテーブルを取得するには、次のクエリを使用します。
SELECT name
FROM sys.objects
WHERE type = 'U'
ORDER BY name;
このクエリは、sys.objects
カタログビューをクエリし、type
列の値が 'U' (テーブルを表す) であるすべての行を選択します。 結果は、name
列のアルファベット順で返されます。
方法 2: INFORMATION_SCHEMA.TABLES ビューを使用する
INFORMATION_SCHEMA.TABLES
ビューは、sys.objects
カタログビューと似ていますが、SQL Server のすべてのバージョンで使用できるという利点があります。
SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
ORDER BY table_name;
このクエリは、INFORMATION_SCHEMA.TABLES
ビューをクエリし、table_name
列の値を選択します。 結果は、table_name
列のアルファベット順で返されます。
方法 3: 動的 SQL を使用する
動的 SQL を使用して、すべてのテーブルのリストを取得することもできます。 これを行うには、sp_tables
システムプロシージャを使用します。
次のコードスニペットは、sp_tables
システムプロシージャを使用してすべてのテーブルを取得する方法を示しています。
DECLARE @table_name NVARCHAR(128);
EXEC sp_tables @table_name = N'', @table_type = N'TABLE';
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @table_name;
EXEC sp_tables @table_name = N'@table_name', @table_type = N'TABLE';
END;
このコードスニペットは、sp_tables
システムプロシージャを 2 回呼び出します。 1 回目の呼び出しでは、空の文字列が渡され、すべてのテーブルの名前が返されます。 2 回目の呼び出しでは、前の呼び出しで返されたテーブル名が渡され、そのテーブルに関連するすべてのビューが返されます。
ヒント
- 特定のスキーマのすべてのテーブルを取得するには、
WHERE
句を使用してクエリをフィルタリングできます。たとえば、AdventureWorks
スキーマのすべてのテーブルを取得するには、次のクエリを使用します。
SELECT name
FROM sys.objects
WHERE type = 'U'
AND schema_name = 'AdventureWorks'
ORDER BY name;
- クエリ結果をさらに制限するには、
LIKE
演算子を使用できます。たとえば、Cust
で始まる名前を持つすべてのテーブルを取得するには、次のクエリを使用します。
SELECT name
FROM sys.objects
WHERE type = 'U'
AND name LIKE 'Cust%'
ORDER BY name;
SELECT name
FROM sys.objects
WHERE type = 'U'
ORDER BY name;
このクエリを実行すると、次のようになります。
Output:
Customers
Employees
Orders
Order Details
Products
この出力は、現在のデータベース内に Customers
、Employees
、Orders
、Order Details
、Products
の 5 つのテーブルがあることを示しています。
以下のサンプルコードは、方法 2: INFORMATION_SCHEMA.TABLES ビューを使用する で説明した方法を使用して、現在のデータベース内のすべてのテーブルのリストを取得する方法を示しています。
SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
ORDER BY table_name;
このクエリを実行すると、前と同じ出力が得られます。
DECLARE @table_name NVARCHAR(128);
EXEC sp_tables @table_name = N'', @table_type = N'TABLE';
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @table_name;
EXEC sp_tables @table_name = N'@table_name', @table_type = N'TABLE';
END;
これらのサンプルコードは、SQL Server Management Studio などのツールを使用して実行できます。
SQL Server で T-SQL を使用してデータベース内のすべてのテーブルのリストを取得するその他の方法
方法 4: カーソルを使用する
カーソルを使用して、sys.objects
カタログビューの行を反復処理し、各行の name
列の値を取得することもできます。
DECLARE c_cursor CURSOR FOR
SELECT name
FROM sys.objects
WHERE type = 'U'
ORDER BY name;
OPEN c_cursor;
FETCH NEXT FROM c_cursor INTO @table_name;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @table_name;
FETCH NEXT FROM c_cursor INTO @table_name;
END;
CLOSE c_cursor;
DEALLOCATE c_cursor;
SQL Server 2016 以降では、列挙を使用して sys.objects
カタログビューの行を反復処理することもできます。
DECLARE enum_cursor CURSOR FOR
SELECT name
FROM sys.objects
WHERE type = 'U'
ORDER BY name;
DECLARE @table_name NVARCHAR(128);
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM enum_cursor INTO @table_name;
PRINT @table_name;
END;
CLOSE enum_cursor;
DEALLOCATE enum_cursor;
SELECT
t.value('name(1)', 'nvarchar(128)') AS table_name
FROM
(
SELECT *
FROM sys.objects
WHERE type = 'U'
FOR XML PATH(''), TYPE
) AS x
CROSS APPLY xml.nodes('//Row') AS xtr
CROSS APPLY xml.column('name', xtr) AS t;
これらの方法はすべて、現在のデータベース内のすべてのテーブルのリストを取得するために使用できます。どの方法を使用するかは、個人の好みや特定の状況によって異なります。
要約
sql-server t-sql database-table