SQLServer 모든 데이터베이스의 테이블 및 열 정보를 검색하는 SQL

이대로 작동합니다.
복사, 편집하여 이용하기 위한 SQL입니다.
자유롭게 사용해도 괜찮습니다.

SQLServer에 있어서, 모든 데이터베이스의 테이블이나 컬럼의 정보를 취득하기 위한 SQL의 병아리입니다.

SQL Server 2014 12.0.x.x에서 동작을 확인하고 있습니다.

모든 데이터베이스의 테이블에 대한 정보를 얻는 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



결과 이미지


모든 데이터베이스의 테이블과 열에 대한 정보를 얻습니다.
--全てのデータベースのテーブルやカラムの情報を取得する。
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);

좋은 웹페이지 즐겨찾기