2016-04-15 17 views
0

単一のSQL Serverインスタンスに対して、サーバーインスタンス上のすべてのデータベース内のすべてのテーブルのすべての列が一覧表示されます。私はすべてのテーブルのすべての列を列挙しているが、データベース名を知っておく必要があるという事例を見出しました。私は、SQL Serverインスタンス上のデータベースをリストするが、データベース内のテーブルはリストしない例を見つけました。今私は2つを組み合わせたものを見つけようとしていますが、私は運があまりありません。SQL Serverインスタンス上のすべてのデータベース、すべてのテーブル、およびすべての列の一覧表示

このようなことが存在するかどうか知っていますか、それともギャップを埋める手作業ですか?

おかげで、

トム

答えて

0

あなたは、動的クエリを使用することができます。私は他の方法を見つけませんでした。

declare @str varchar(max) = '' 
;with dbs as (
select * 
from sys.databases 
where dbs.name not in ('master', 'tempdb', 'model', 'msdb') 
) 
select @str = @str + 'select ''' + dbs.name + ''', tbl.name, col.name from ' + 
    dbs.name + '.sys.tables tbl inner join ' + 
    dbs.name + '.sys.columns col ON col.object_id = tbl.object_id; ' 
from dbs 

print @str 
exec(@str) 
0

これを試してコメントをフィードバックしてください。

要件は、すべてのデータベースから1つの特定のテーブルを見つけることでした。これは、時間がかかり、人為的なエラーが発生する可能性があるため、目視検査では不可能でした。彼女はシステムビューsys.tablesを知っていました。

上記のクエリの制限は、1つのデータベース内を検索するだけであり、ユーザーは手動でデータベースを変更してクエリを再実行する必要があります。私は、サーバー上のすべてのデータベースを調べ、名前に検索語を含むデータベース名、スキーマ名、およびテーブルを提供するクイックスクリプトに続いて書きました。

CREATE PROCEDURE usp_FindTableNameInAllDatabase 
@TableName VARCHAR(256) 

AS 
DECLARE @DBName VARCHAR(256) 
DECLARE @varSQL VARCHAR(512) 
DECLARE @getDBName CURSOR 
SET @getDBName = CURSOR FOR 

SELECT name 
FROM sys.databases 
CREATE TABLE #TmpTable (DBName VARCHAR(256), 
SchemaName VARCHAR(256), 
TableName VARCHAR(256)) 
OPEN @getDBName 
FETCH NEXT 
FROM @getDBName INTO @DBName 
WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @varSQL = 'USE ' + @DBName + '; 
INSERT INTO #TmpTable 
SELECT '''+ @DBName + ''' AS DBName, 
SCHEMA_NAME(schema_id) AS SchemaName, 
name AS TableName 
FROM sys.tables 
WHERE name LIKE ''%' + @TableName + '%''' 
EXEC (@varSQL) 
FETCH NEXT 
FROM @getDBName INTO @DBName 
END 
CLOSE @getDBName 
DEALLOCATE @getDBName 
SELECT * 
FROM #TmpTable 
DROP TABLE #TmpTable 
GO 

EXEC usp_FindTableNameInAllDatabase 'Address' 
GO 
関連する問題