SQLServer 全てのデータベースのテーブルやカラムの情報を取得するSQL

このまま動作します。
コピぺ、編集して利用するためのSQLです。
自由に使って頂いて構いません。

SQLServerにおいて、全てのデータベースのテーブルやカラムの情報を取得するためのSQLの雛形です。

SQL Server 2014 12.0.x.xで動作確認をしています。

#全てのデータベースのテーブルの情報を取得するSQL

結果のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666335/fc656d9d-0eb5-54e2-53c7-4a22b6bdd57d.png)

```sql:全てのデータベースのテーブルの情報を取得する.sql
--全てのデータベースのテーブルの情報を取得する。
DECLARE databaseNameList CURSOR FOR SELECT name FROM sys.databases --ここでWHERE条件を指定して対象データベースを絞り込める。
OPEN databaseNameList;

--全てのデータベースの全てのテーブルの情報を取得するSQLを組み立てる。
DECLARE @sql nvarchar(MAX);
SET @sql = '';

--databaseNameList分繰り返す。
DECLARE @databaseName nvarchar(MAX);
FETCH NEXT FROM databaseNameList INTO @databaseName;
WHILE @@FETCH_STATUS = 0
BEGIN
    IF LEN(@sql) > 0
    BEGIN
        SET @sql += ' UNION '
    END

    --「UNION 操作の "SQL_Latin1_General_CP1_CI_AS" と "Japanese_CI_AS" 間での照合順序の競合を解決できません。」等と
	--エラーになったら、「照合順序の競合時に要COLLATE」とある列に「COLLATE Japanese_CI_AS」等として照合順序を指定する。
    --この例では「COLLATE Japanese_CI_AS 」としているが、使用状況に応じて要調整。
    SET @sql += 
        'SELECT
            ''' + @databaseName + ''' as "データベース名",
            sysobjects.name COLLATE Japanese_CI_AS テーブル名, --照合順序の競合時に要COLLATE
            (
				SELECT syscolumns.name + '', ''
				FROM ['+ @databaseName +'].dbo.syscolumns syscolumns
				WHERE sysobjects.id = syscolumns.id
				FOR XML PATH('''')
			) AS "カラム名一覧"
        FROM
            ['+ @databaseName +'].dbo.sysobjects sysobjects
        WHERE
            sysobjects.type = ''U''
            AND
            sysobjects.category = 0

        --ここでWHERE条件を指定して内容を絞り込める。
        '
    FETCH NEXT FROM databaseNameList INTO @databaseName;
END;
CLOSE databaseNameList;
DEALLOCATE databaseNameList;

--print(@sql); --デバッグ用。組み立てたSQLの内容を表示する。

--組み立てたSQLを実行する。
EXEC(@sql);
```

#全てのデータベースのテーブルやカラムの情報を取得するSQL

結果のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666335/49b5c978-5936-e6d2-9255-ae9f0ddc35cd.png)

```sql:全てのデータベースのテーブルやカラムの情報を取得する.sql
--全てのデータベースのテーブルやカラムの情報を取得する。
DECLARE databaseNameList CURSOR FOR SELECT name FROM sys.databases　--ここでWHERE条件を指定して対象データベースを絞り込める。
OPEN databaseNameList;

--全てのデータベースのテーブルやカラムの情報を取得するSQLを組み立てる。
DECLARE @sql nvarchar(MAX);
SET @sql = '';

--databaseNameList分繰り返す。
DECLARE @databaseName nvarchar(MAX);
FETCH NEXT FROM databaseNameList INTO @databaseName;
WHILE @@FETCH_STATUS = 0
BEGIN
    IF len(@sql) > 0  
    BEGIN
        SET @sql += ' UNION '
    END

    --「UNION 操作の "SQL_Latin1_General_CP1_CI_AS" と "Japanese_CI_AS" 間での照合順序の競合を解決できません。」等と
    --エラーになったら、「照合順序の競合時に要COLLATE」とある列に「COLLATE Japanese_CI_AS」等として照合順序を指定する。
    --この例では「COLLATE Japanese_CI_AS 」としているが、使用状況に応じて要調整。
    SET @sql +=
        'SELECT
            ''' + @databaseName + ''' AS データベース,
            SCHEMAS.NAME COLLATE Japanese_CI_AS AS スキーマ, --照合順序の競合時に要COLLATE
            TABLES.NAME COLLATE Japanese_CI_AS AS テーブル, --照合順序の競合時に要COLLATE
            COLUMNS.COLUMN_ID AS [列番号],
            COLUMNS.NAME COLLATE Japanese_CI_AS AS 列名, --照合順序の競合時に要COLLATE
            TYPES.NAME COLLATE Japanese_CI_AS AS 型, --照合順序の競合時に要COLLATE
            CASE 
                WHEN TYPES.NAME IN (''NVARCHAR'', ''NCHAR'') THEN COLUMNS.MAX_LENGTH / 2 
                WHEN COLUMNS.PRECISION = 0 THEN COLUMNS.MAX_LENGTH
                ELSE COLUMNS.PRECISION
            END AS 桁,
            COLUMNS.SCALE AS 小数部の桁数,
            COLUMNS.MAX_LENGTH AS サイズ,
            COLUMNS.IS_NULLABLE AS NULL許容
        FROM
            [' + @databaseName + '].SYS.TABLES AS TABLES
            LEFT JOIN [' + @databaseName + '].SYS.SCHEMAS AS SCHEMAS 
                ON TABLES.SCHEMA_ID = SCHEMAS.SCHEMA_ID
            LEFT JOIN [' + @databaseName + '].SYS.COLUMNS AS COLUMNS 
                ON TABLES.OBJECT_ID = COLUMNS.OBJECT_ID
            LEFT JOIN [' + @databaseName + '].SYS.TYPES AS TYPES
                ON COLUMNS.SYSTEM_TYPE_ID = TYPES.SYSTEM_TYPE_ID AND COLUMNS.USER_TYPE_ID = TYPES.USER_TYPE_ID
            LEFT JOIN [' + @databaseName + '].SYS.EXTENDED_PROPERTIES AS EXTENDED_PROPERTIES
                ON COLUMNS.OBJECT_ID = EXTENDED_PROPERTIES.MAJOR_ID AND COLUMNS.COLUMN_ID = EXTENDED_PROPERTIES.MINOR_ID

        --ここでWHERE条件を指定して内容を絞り込める。
        '
    FETCH NEXT FROM databaseNameList INTO @databaseName;
END;
CLOSE databaseNameList;
DEALLOCATE databaseNameList;

--print(@sql); --デバッグ用。組み立てたSQLの内容を表示する。

--組み立てたSQLを実行する。
EXEC (@sql);
```