LoginSignup
1
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-09

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

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

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

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

結果のイメージ
image.png

全てのデータベースのテーブルの情報を取得する.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

全てのデータベースのテーブルやカラムの情報を取得する.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);
1
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5