SQL Serverのテーブルから列名を取得するにはどうすればよいですか?


715

テーブルのすべての列の名前を問い合わせたいのですが。私はこれを行う方法を見つけました:

しかし、私は知る必要があります:これはMicrosoft SQL Server(私の場合は2008)でどのように実行できますか?


48
簡単で汚いトリックとして、私は本当にやりたいですSELECT * FROM my_table WHERE 1=0
bgusach

12
@bgusach-ユーザーがテーブルの行として列の名前を望んでいるようですが、あなたがやろうとしているのは、SELECT TOP 0 * FROM my_tableキーストロークが少ないことです
Jake Wood

@bgusach:それは私の答えのように聞こえます。投稿してください。
palswim

回答:


863

情報スキーマビューにクエリを実行することで、この情報などを取得できます

このサンプルクエリ:

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'

これらすべてのDBオブジェクトに対して作成できます。


25
"= N'Customers '"の "N"は何を表していますか?
Qbik、2014年

20
ANSI(32bit)のvarcharやunicode(64bit)のnvarcharのようなUnicode文字列をハンドリングする場合はQbik "N"
thatsalok

9
確認済み:MariaDBでも動作します!:)(なしNortwind....)
jave.web 2016年

5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';これは私にとってはうまくいく
Pavol Travnik

1
私はTABLE_SCHEMA = '?' AND TABLE_NAME = '?'localhost を使用していて、同じ名前で異なるデータベースに複数のテーブルがあるため、使用する必要がありました。
-akinuri

194

特定のテーブルのすべての列に関する情報を返すストアドプロシージャsp_columnsを使用できます。詳細については、http://msdn.microsoft.com/en-us/library/ms176077.aspxを参照してください。

SQLクエリでも実行できます。このようないくつかのことが役立つはずです:

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.yourTableName') 

または、バリエーションは次のようになります。

SELECT   o.Name, c.Name
FROM     sys.columns c 
         JOIN sys.objects o ON o.object_id = c.object_id 
WHERE    o.type = 'U' 
ORDER BY o.Name, c.Name

これにより、すべてのテーブルからすべての列が取得され、テーブル名、列名の順に並べられます。


148
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

これは直接sys.columns表示DATA_TYPEされるので、取得するよりも優れています。


5
これは標準のANSI SQLである+1(en.wikipedia.org/wiki/Information_schema)sys.objectsなどのその他の回答は標準ではありません
エンジニア

テーブルが別のスキーマ(SQLサーバーの「スキーマ」バリアント)にある場合AND TABLE_SCHEMA = 'schemaName'は、WHERE句を追加します。
ヨハン

非常に便利です。「SELECT」ステートメントを追加JOIN sys.types t on c.system_type_id = t.system_type_idおよび追加t.nameして、各列名の横にあるタイプも取得できます。
Pac0 2017年

56

sp_helpSQL Server 2008で使用できます。

sp_help <table_name>;

上記のコマンドのキーボードショートカット:テーブル名を選択(つまり、強調表示)してALT+ を押しF1ます。


1
これは、私のお気に入りのキーボードショートカットです。また、Cntl-F1にsp_helptextを割り当てます。これら2つのショートカットを組み合わせると、時間を大幅に節約できます。
ポールウェランド

44

このクエリを使用すると、答えが得られます。

select Column_name 
from Information_schema.columns 
where Table_name like 'table name'

35

このクエリを記述して、MySqlでINFORMATION_SCHEMAを使用せずに列名とすべての詳細を取得できます。

SHOW COLUMNS FROM database_Name.table_name;

7
@Benjamin、この質問は、SQL Serverのためのものであり、この答えは、MySQL用ですので
Caimen

1
MySqlを使用しているほとんどの人がこの問題に直面しています。そして私はそれについて述べました。MySqlを使用しています。
Sachin Parse 2017

5
他のRDBMSを使用しているほとんどの人が同じ問題を抱えているかどうかは関係ありません。それは元の質問とは無関係であり、関連する回答をさらに押し下げます。
Demonblack 2018年

1
質問は具体的にはmssqlに向けられているため、反対票を投じます
Lucas

27
--This is another variation used to document a large database for conversion (Edited to --remove static columns)

SELECT o.Name                   as Table_Name
     , c.Name                   as Field_Name
     , t.Name                   as Data_Type
     , t.length                 as Length_Size
     , t.prec                   as Precision_
FROM syscolumns c 
     INNER JOIN sysobjects o ON o.id = c.id
     LEFT JOIN  systypes t on t.xtype = c.xtype  
WHERE o.type = 'U' 
ORDER BY o.Name, c.Name

--In the left join, c.type is replaced by c.xtype to get varchar types

22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME あなたのテーブルです


15
SELECT column_name, data_type, character_maximum_length, table_name,ordinal_position, is_nullable 
FROM information_schema.COLUMNS WHERE table_name LIKE 'YOUR_TABLE_NAME'
ORDER BY ordinal_position


11

このSOの質問には、次のアプローチが欠けています。

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')

10

指定されたtableベーステーブルであるかどうかをチェックします。

SELECT 
    T.TABLE_NAME AS 'TABLE NAME',
    C.COLUMN_NAME AS 'COLUMN NAME'
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME=C.TABLE_NAME
    WHERE   T.TABLE_TYPE='BASE TABLE'
            AND T.TABLE_NAME LIKE 'Your Table Name'

10

これを試すことができます。これにより、すべての列名にそれぞれのデータ型が与えられます。

desc <TABLE NAME> ;

これがOracleで機能することは知っています。しかし、これはMicrosft SQLで機能しますか?ありがとうございました。
DxTx 2018

6

このクエリを使用できます

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'


5

間違いなくもっと直感的なもう1つのオプションは次のとおりです。

SELECT [name] 
FROM sys.columns 
WHERE object_id = OBJECT_ID('[yourSchemaType].[yourTableName]') 

これにより、すべての列名が1つの列に表示されます。他のメタデータに関心がある場合は、SELECT STATEMENT TOを編集して変更できますSELECT *


3

回答の要約

私はさまざまな答えとこれを行う方法を見ることができますが、これには問題があり、それがobjectiveです。

はい、目的。only knowあなたが使用できる列名にしたい場合

SELECT * FROM my_table WHERE 1=0
or
SELECT TOP 0 * FROM my_table

しかし、useこれらの列をどこかにしたい場合、または単にmanipulateそれらを言う場合は、上記の簡単なクエリは役に立たないでしょう。使用する必要があります

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Customers'

同様の列が必要な特定の列を知るもう1つの方法

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'


0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

シンプルで、sysテーブルが不要

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