命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術や趣味についてのメモ。

SQL Serverで全DB全テーブル全カラムのメタデータを取得する

背景

テーブルレイアウトも仕様書も、弊社内製既存のアプリがことごとく情報がなく、とりあえずDBのメタデータを出力することに。とりあえずメモ。

これらを使って開発側で仕様や意味合いなどまとめていきたい。。。

環境

コード

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/

メタデータ関連

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com