SQL Serverで全DB全テーブル全カラムのメタデータを取得する
背景
テーブルレイアウトも仕様書も、弊社内製既存のアプリがことごとく情報がなく、とりあえずDBのメタデータを出力することに。とりあえずメモ。
これらを使って開発側で仕様や意味合いなどまとめていきたい。。。
環境
- SQL Server 2014
コード
DECLARE @DBName NVARCHAR(256) DECLARE @varSQL NVARCHAR(512) DECLARE @getDBName CURSOR SET @getDBName = CURSOR FOR SELECT name FROM sys.databases CREATE TABLE #TmpTable ( DBName NVARCHAR(256),SchemaName NVARCHAR(256),TableName NVARCHAR(256),ColumnName NVARCHAR(256), ValueType NVARCHAR(256),max_length NVARCHAR(256),precision NVARCHAR(256),scale NVARCHAR(256),is_nullable NVARCHAR(256) ) OPEN @getDBName FETCH NEXT FROM @getDBName INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN print @DBName; SET @varSQL = 'USE ' + @DBName + '; INSERT INTO #TmpTable SELECT ''' + @DBName + ''' AS DatabaseName , SCHEMA_NAME(obj.schema_id) AS SchemaName , obj.name AS TableName , col.name AS ColumnName , typ.name AS ValueType , col.max_length , col.precision , col.scale , col.is_nullable FROM sys.objects obj INNER JOIN sys.columns col ON obj.object_id = col.object_id INNER JOIN sys.types typ ON col.user_type_id = typ.user_type_id WHERE obj.type = ''U'' ' EXEC (@varSQL) FETCH NEXT FROM @getDBName INTO @DBName END CLOSE @getDBName DEALLOCATE @getDBName SELECT * FROM #TmpTable ORDER BY DBName,TableName,ColumnName DROP TABLE #TmpTable
参考
各データベースへのループ処理
https://blog.sqlauthority.com/2008/04/29/sql-server-find-table-in-every-database-of-sql-server/