はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

SQL Serverでテーブル名一覧を取得する方法

SQL Server テーブル名取得」で検索すると、ヒットするものの大半がSQL Server 2000互換のsysobjectsを使った例でしかなく、また、スキーマ名を意識していないものしか出てこないです。

SQL Server 2005以降であれば、sys.tablesですし、スキーマ名込みであれば以下のようにJOINすればOKです。

SELECT s.name,t.name
FROM sys.tables t JOIN sys.schemas s ON t.schema_id=s.schema_id
ORDER BY s.name,t.name

 

なお、MSDNにはsysobjectsとsys.tablesは次のように記載があります。

 

sysobjects:

http://technet.microsoft.com/ja-jp/library/ms177596.aspx

「この SQL Server 2000 システム テーブルは、下位互換性を保つためにビューとして含まれています。代わりに、現在の SQL Server システム ビューを使用することをお勧めします。…(中略)…現在この機能を使用しているアプリケーションは修正するようにしてください。 」

 

sys.tables

http://technet.microsoft.com/ja-jp/library/ms187406.aspx

「カタログ ビューでのメタデータの表示が、ユーザーが所有しているかそのユーザーが権限を許可されている、セキュリティ保護可能なメタデータに制限されます。」

 

まさに自分が作ろうとしている場所にテーブルがあるかどうかを知りたいには、sys.tablesが該当しますね。

更に残念なのは、sys.objectsならschema_id欄があるのでスキーマ別にとれるというのが気づけるのですが、sys.sysobjectsにはschema_id欄がないくてスキーマ無視してしまうという点ですね。