データベース内のテーブルと各テーブルのフィールドのリストを取得する


84

基本的なORM(純粋に楽しみのため)の作成を検討していますが、データベース内のテーブルのリストとすべてのテーブルのフィールドを返す方法はありますか?

これを使用して、結果セット(C#)をループし、結果セット内の各テーブルに対してこれを実行できるようにします(たとえば、リフレクションを使用して、xyzを実行または含むクラスを作成します)。

これに加えて、SQL Serverの優れたオンラインブログは何ですか?この質問は、SQL ServerでのシステムSPとデータベースの使用に関するものであり、一般的なクエリでも問題ないので、この種の機能を扱っているブログに興味があります。

ありがとう


再; SQL Serverブログリスト-私のブログのこのエントリを見てください:dbalink.wordpress.com/2009/01/07/…– MarlonRibunal 2009
1

関連する重複質問を参照してください:stackoverflow.com/questions/175415/…–
Ray

1
ありがとう。タスクはC#で実行できます。
gurdeepS 2009

回答:


172

これはあなたが探しているものですか:

オブジェクトカタログビューの使用

 SELECT T.name AS Table_Name ,
       C.name AS Column_Name ,
       P.name AS Data_Type ,
       P.max_length AS Size ,
       CAST(P.precision AS VARCHAR) + '/' + CAST(P.scale AS VARCHAR) AS Precision_Scale
FROM   sys.objects AS T
       JOIN sys.columns AS C ON T.object_id = C.object_id
       JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE  T.type_desc = 'USER_TABLE';

情報スキーマビューの使用

  SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS;

参照:私のブログ-http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/


7
最初のクエリは常にcharに対してmaxlength = 8000を返しますが、これは正しくありません。2番目のクエリは正しく、より詳細です
smirkingman 2014年

1
両方のクエリが異なる行数を返します:/
GorvGoyl 2017

このINFORMATION_SCHEMAアプローチの利点の1つは、さまざまなデータベース間で非常に移植性が高いことです。
j_random_hacker

それはタイプミスですか?私は使用しますC.max_length AS Size ,-そうでなければ、@ smirkingmanが述べたようにmaxlength = 8000になってしまいます。
mbx 2018年

1番目のクエリがスキーマをリストしておらず、返される行(重複)が多すぎて、2番目のクエリが正しい行数を返していることがわかりました。したがって、2番目のクエリを使用します。
ゲイリーバレット

36

テーブル::

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

列::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

または

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'

8
INFORMATION_SCHEMAの優れた点は、SQLサーバーだけでなく、ISOでもあるということです。同じコードがすべての準拠データベースで機能します
cindi 2009年

これは非常に便利です...しかし、上記の式にデータベース名を含めるにはどうすればよいですか?事前のおかげで...
アミットバーマ

@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (少なくともMS SQL構文)
クリス・O

12

データベース内のすべてのテーブルとフィールドのリストを取得します。

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName'

テーブル内のすべてのフィールドのリストを取得します。

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName' 

このINFORMATION_SCHEMAアプローチの利点の1つは、さまざまなデータベース間で非常に移植性が高いことです。
j_random_hacker


7

私はいくつかのソリューションをテストしたところ、

Select *
From INFORMATION_SCHEMA.COLUMNS

CURRENT / defaultデータベースの列情報を提供します。

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

、<および>を指定しないと、データベースDBNAMEの列情報が表示されます。


3

ここにある他の組み込みの友達は、システムsprocSP_HELPです。

使用例::

sp_help <MyTableName>

それはあなたが本当に必要とするよりもはるかに多くの情報を返しますが、あなたの可能な要件の少なくとも90%は満たされます。


1

これを捨てるだけです-単語やグーグルドキュメントにコピーして貼り付けるのは簡単です:

PRINT '<html><body>'
SET NOCOUNT ON
DECLARE @tableName VARCHAR(30)
DECLARE tableCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT T.name AS TableName 
      FROM sys.objects AS T
     WHERE T.type_desc = 'USER_TABLE'
     ORDER BY T.name
OPEN tableCursor
FETCH NEXT FROM tableCursor INTO @tableName
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT '<h2>' + @tableName + '</h2>'
    PRINT '<pre>'
    SELECT LEFT(C.name, 30) AS ColumnName,
           LEFT(ISC.DATA_TYPE, 10) AS DataType,
           C.max_length AS Size,
           CAST(P.precision AS VARCHAR(4)) + '/' + CAST(P.scale AS VARCHAR(4)) AS PrecScale,
           CASE WHEN C.is_nullable = 1 THEN 'Null' ELSE 'No Null' END AS [Nullable],
           LEFT(ISNULL(ISC.COLUMN_DEFAULT, ' '), 5)  AS [Default],
           CASE WHEN C.is_identity = 1 THEN 'Identity' ELSE '' END AS [Identity]
    FROM   sys.objects AS T
           JOIN sys.columns AS C ON T.object_id = C.object_id
           JOIN sys.types AS P ON C.system_type_id = P.system_type_id
           JOIN INFORMATION_SCHEMA.COLUMNS AS ISC ON T.name = ISC.TABLE_NAME AND C.name = ISC.COLUMN_NAME
    WHERE  T.type_desc = 'USER_TABLE'
      AND  T.name = @tableName
    ORDER BY T.name, ISC.ORDINAL_POSITION
    PRINT '</pre>'
    FETCH NEXT FROM tableCursor INTO @tableName

END

CLOSE tableCursor
DEALLOCATE tableCursor
SET NOCOUNT OFF
PRINT '</body></html>'

1

MYSQLの場合:

Select *
From INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = "<DatabaseName>"

TABLE_SCHEMAはデータベース名ではなく、スキーマ名(ie dbo)です。TABLE_CATALOGデータベース名です。
DDuffy

TABLE_SCHEMA:テーブルが属するスキーマ(データベース)の名前。TABLE_CATALOG:テーブルが属するカタログの名前。
Jyotiranjan

mysqlで。mssqlではありません。私を誤解しないでください、私はあなたの答えが間違っていたと言っていません。これは正しいですが、mssqlの場合はそうではありません。どちらもスキーマの扱いが違うと思います。
DDuffy

0

これにより、ユーザーが作成したすべてのテーブルが取得されます。

select * from sysobjects where xtype='U'

colsを取得するには:

Select * from Information_Schema.Columns Where Table_Name = 'Insert Table Name Here'

また、http: //www.sqlservercentral.com/はかなり優れたdbリソースであることがわかりました。


0

これにより、データベース名、テーブル名、列名、およびデータベースパラメータで指定された列のデータ型が返されます。

declare @database nvarchar(25)
set @database = ''

SELECT cu.table_catalog,cu.VIEW_SCHEMA, cu.VIEW_NAME, cu.TABLE_NAME,   
cu.COLUMN_NAME,c.DATA_TYPE,c.character_maximum_length
from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE as cu
JOIN INFORMATION_SCHEMA.COLUMNS as c
on cu.TABLE_SCHEMA = c.TABLE_SCHEMA and c.TABLE_CATALOG = 
cu.TABLE_CATALOG
and c.TABLE_NAME = cu.TABLE_NAME
and c.COLUMN_NAME = cu.COLUMN_NAME
where cu.TABLE_CATALOG = @database
order by cu.view_name,c.COLUMN_NAME

すべてのビューについて、これは、ビューによって返されるすべての列のテーブル名、列名、データ型、および長さをリストします。これは質問に答えませんが、きちんとした質問です。
ベン

0

SQL Developerを使用して、特定のDBのテーブルと列の詳細をフェッチする簡単な方法を見つけました。

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS すべてを取得するため

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSすべてのテーブル名を取得します。sqlserverで試してみてください。


-1

Microsoft SQL Serverでは、これを使用できます。

declare @sql2 nvarchar(2000)
        set @sql2  ='
use ?
if (  db_name(db_id()) not in (''master'',''tempdb'',''model'',''msdb'',''SSISDB'')  )
begin   

select
    db_name() as db,
    SS.name as schemaname,
    SO.name tablename,
    SC.name columnname,
    ST.name type,
    case when ST.name in (''nvarchar'', ''nchar'')
        then convert(varchar(10), ( SC.max_length / 2 ))
        when ST.name in (''char'', ''varchar'')
        then convert(varchar(10), SC.max_length)
        else null
    end as length,
    case when SC.is_nullable = 0 then ''No'' when SC.is_nullable = 1 then ''Yes'' else null end as nullable,
    isnull(SC.column_id,0) as col_number
from sys.objects                  SO
join sys.schemas                  SS
    on SS.schema_id = SO.schema_id
join sys.columns             SC
on SO.object_id     = SC.object_id
left join sys.types               ST
    on SC.user_type_id = ST.user_type_id and SC.system_type_id = ST.system_type_id
    where SO.is_ms_shipped = 0 
end
'

exec sp_msforeachdb @command1 = @sql2

これにより、すべてのユーザー定義データベースのすべてのテーブルと列(およびそれらの定義)が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.