2017-05-12 11 views
0

私が見つけたのは、一度に1つのデータベース(例:select * from information_schema.columns)にしか見えないようです。 sys.databasesからselect *のようなものがありますか?データベース名のすべてだけでなく、独自のテーブル名とカラム名も含まれていますか?Microsoft SQL Server:すべてのデータベースとそれに対応するテーブルと列のリストを照会する

これらのすべてをサーバーで確認します(データベース名、テーブル名、列名)。

私は新しい会社のサーバーに慣れ親しんでおり、すべてのデータベースのテーブル名と列を参照するだけで探索したいと考えています。また、私は書き込みアクセスを持っておらず、これをTableauカスタムSQLで行っています。

+0

文書化されていないsp_msforeachdbを使用できますが、データベースをスキップすることがあります。おそらく私がやることであろう、これに対して動的SQLを活用することもできます。何を出力したいですか?ちょうどdatabasename、tablenameとcolumnname? –

+0

そのようなことをする唯一の方法は、動的SQLを使用することです。あなたの本当の目標は何ですか?なぜあなたはこれをしたいのですか?何が必要だと思いますか?おそらくあなたは間違った質問をしているかもしれません。なぜなら、私はこれが本当に価値があるのか​​想像できないからです。あなたの特定の必要性にあなたの質問を集中させることができますか? – pmbAustin

+0

はい、これらの3つのものが必要です。私は新しい会社のサーバーに慣れようとしており、各データベースのテーブル名と列を参照するだけで探索したいと考えています。また、私は書き込みアクセス権を持っていませんし、これをTableauカスタムSQLで行っています。 – JJBee

答えて

-2

よろしいですか? sys.databases FROM

--database名

SELECT名

--table名SYS.TABLES FROM

SELECT名

--column名

SELECT名 FROM sys.columns

これは役に立ちますか?

+0

申し訳ありませんが、それはあなたに名前を与えます。それ以上のものを望むなら、*を使うこともできます。 – MLangford

+0

OPは、この情報を、現在のデータベースだけでなく、サーバー上のすべてのデータベースに必要とします。 –

0

あなたはこのようなものを探していますか?あなたはmsforeachdbを試すことができます

EXEC sp_MSforeachdb N' 
BEGIN 
    use ? 
    select * from information_schema.tables 
    select * from information_schema.columns 
END'; 
0

私は文書化されていない手順の大きなファンではありません。そして、sp_msforeachdbはデータベースをスキップし、誰も本当に理由を知りません。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx私はまた、文書化されていない手続きがすべてあるカーソルを気にしません。あなたがコードを見ると、それは1つの大きな醜いカーソルです。あなたが望むだけ単純なもののために、私はそれを作成するためにいくつかの動的なSQLとsysテーブルを使用することを好む。

ここで私はこの作業について説明します。それは、文書化されていない手続きよりもはるかに多くのコードではありません。大きな利点は、デバッグするのが簡単でカーソルがないことです。 :)私は前に使ってきた

declare @SQL nvarchar(max) = '' 

select @SQL = @SQL + 'select ''' + d.name + ''' as DatabaseName 
    , t.name collate SQL_Latin1_General_CP1_CI_AS as TableName 
    , c.name collate SQL_Latin1_General_CP1_CI_AS as ColumnName 
from ' + quotename(d.name) + '.sys.tables t 
join ' + quotename(d.name) + '.sys.columns c on c.object_id = t.object_id UNION ALL ' 
from sys.databases d 

set @SQL = LEFT(@SQL, len(@SQL) - 10) + ' order by DatabaseName, TableName, ColumnName' 

select @SQL --once you are satisfied the sql is correct just uncomment the line below 
--exec sp_executesql @SQL 
0

ワン:私はより良い結果のデータを操作することができますので、私は通常、一時テーブルにそれをダンプ

EXEC master.sys.sp_MSForEachDB N' 
    IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'') 
    BEGIN 
    USE ? 
    SELECT ''?'' AS theDatabase 
     , OBJECT_SCHEMA_NAME([tables].[object_id],DB_ID()) AS theSchema 
     , [tables].name AS theTable 
     , [columns].[name] AS theColumn 
     , [types].[name] AS theDatatype 
     , [columns].max_length AS columnSize 
     , [columns].[precision] AS columnPrecision 
     , [columns].scale AS columnScale 
     , [columns].is_nullable AS isNullable 
    FROM sys.tables AS [tables] 
    INNER JOIN sys.all_columns [columns] ON [tables].[object_id] = [columns].[object_id] 
    INNER JOIN sys.types [types] ON [columns].system_type_id = [types].system_type_id 
     AND [columns].user_type_id = [types].user_type_id 
    WHERE [tables].is_ms_shipped = 0 
    ORDER BY [tables].name, [columns].column_id 
    END 
' 

私はsp_MSforEachDBの欠落したテーブルで問題にぶつかりませんでしたが、問題についてAaronの記事をチェックします。彼は間違いなく私が信頼する名前です。 :-)

関連する問題