このまま動作します。
コピぺ、編集して利用するためのSQLです。
自由に使って頂いて構いません。
SQLServerにおいて、全てのデータベースのテーブルやカラムの情報を取得するためのSQLの雛形です。
SQL Server 2014 12.0.x.xで動作確認をしています。
#全てのデータベースのテーブルの情報を取得する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
全てのデータベースのテーブルやカラムの情報を取得する.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);