テーブルの列名をどのように返しますか?


239

SQL Server 2008を使用してテーブルの列名を返すにはどうすればよいですか?つまり、テーブルにはこれらの列(ID、名前、住所、国)が含まれており、これらをデータとして返します。

回答:


399

2008バージョンでもっと簡単な方法があるかどうかはわかりません。

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'

6
「YourSchemaName」とは何ですか?
ドリューディン2013

12
'YourSchemaName'は、クエリの対象となるテーブルのスキーマです。例:dbo.myTable、「dbo」は「myTable」が属するスキーマです。スキーマを使用すると、各テーブルを個別に割り当てるのではなく、グループに権限を簡単に割り当てることができます。あまりにもこの質問を参照してください:stackoverflow.com/questions/1062075/...
jmosesman

3
USE DatabaseNameコマンドを忘れないでください。それ以外の場合は、マスターデータベースまたは別のデータベースで検索できます
Muflix

1
SELECT_COLUMN_NAME、* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA = 'dbo'
Usman Younas

112

これが最も簡単な方法です

exec sp_columns [tablename]

2
これは短くて簡単です、正解でなければなりません。最初に質問されたとき、それは存在しなかったと思います:)
DanteTheSmith

1
スキーマがdboでない場合は、それを追加パラメーターとして渡す必要があります。exec sp_columns [TableName]、@table_owner = [schema]
Pradeep


13

1つの方法は、syscolumnsをクエリすることです。

select
   syscolumns.name as [Column],
   syscolumns.xusertype as [Type],
   sysobjects.xtype as [Objtype]
from 
   sysobjects 
inner join 
   syscolumns on sysobjects.id = syscolumns.id
where sysobjects.xtype = 'u'
and   sysobjects.name = 'MyTableName'
order by syscolumns.name

1
私はこれが本当に好きです。私を見つけるObjtypeのに:)、列冗長を
ジョエル・

1
結合(sysobjects so inner join syscolumns sc on so.id = sc.id)を完全に記述した方がいいのではないでしょうか。これはパフォーマンスを犠牲にして怠惰な回答のようです。私は間違っている可能性があります...
Losbear

1
@LosbearがP​​Sを変更しましたPS:怠惰ではなく、8年前のコードです。:)昔(バージョン4.2以降のSQL Serverを使用していました)、SQLクエリをこの方法で作成していました。パフォーマンスの問題はありません。
splattne 2017年

9

これは、OBJECT_ID()関数を使用してテーブルのIDを見つけるため、上記の提案よりも少し簡単に見えます。そのIDの列はすべてテーブルの一部です。

SELECT * 
  FROM syscolumns 
 WHERE id=OBJECT_ID('YOUR_TABLE') 

私は通常、同様のクエリを使用して、新しいバージョンの一部であることがわかっている列が存在するかどうかを確認します。これは、WHERE句に{AND name = 'YOUR_COLUMN'}を追加した同じクエリです。

IF EXISTS (
        SELECT * 
          FROM syscolumns 
         WHERE id=OBJECT_ID('YOUR_TABLE') 
           AND name='YOUR_COLUMN'
        )
BEGIN
    PRINT 'Column found'
END

8

これを試して

select * from <tablename> where 1=2

...............................................


興味深いですが、その背後にあるロジックは何ですか?
nilakantha singh deo 2018

@nilakanthasinghdeo、論理は、常にゼロ行をWHERE 1=2返し、列メタデータも返すという論理です。ODBCなどのプログラムインターフェイスを使用している場合、この列情報はプログラム内のカーソルオブジェクトからリスト/配列としてアクセスできます。これは私が探していたものです。純粋なSQLコンテキストでは意味がないかもしれませんが、Python / Java / C / etcを介してデータベースに接続する場合は簡潔なアプローチです。
Arthur Hebert

5

以下は上記の最初に提案されたクエリのようですが、データベースを指定しないと機能しない場合があります。クエリはTABLE_SCHEMAを指定しなくても機能することに注意してください。

SELECT COLUMN_NAME
FROM   YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'

4

私が使う

SELECT st.NAME, sc.NAME, sc.system_type_id
FROM sys.tables st
INNER JOIN sys.columns sc ON st.object_id = sc.object_id
WHERE st.name LIKE '%Tablename%'

3

なぜこれを試さないのですか?

テーブルを右クリック->スクリプトテーブルの名前->作成先->新しいクエリエディターウィンドウ?

列のリスト全体がスクリプトで指定されています。それをコピーして、必要に応じてフィールドを使用します。


3
著者はおそらく、ストアドプロシージャやその他のスクリプトで使用するために、プログラムからテーブルから列名を取得する方法を知りたいと考えていました。
KLee1

1
答えは"I want to return these as data"を示していますが、答えは値を取得しますが、OPは実行時にデータを必要とする可能性があります。
StuperUser 2012年


1
CREATE PROCEDURE [dbo].[Usp_GetColumnName]      
        @TableName varchar(50)
AS
BEGIN   
    BEGIN
        SET NOCOUNT ON
        IF (@TableName IS NOT NULL) 
            select ORDINAL_POSITION OrderPosition,COLUMN_NAME ColumnName from information_schema.columns 
             where table_name =@TableName
             order by ORDINAL_POSITION
    END
END

2
SOへようこそ!しかし、この質問は約3年前に満足のいく回答を得ているようです...また、コードを投稿するときは、{}を使用して強調表示します。よくある質問を見て、それがここに始める上でいくつかの良い情報を持っていますstackoverflow.com/faq
バレンチノVranken

1

syscolumns.colidの値がsp_columnsの一部として返される 'ORDINAL_POSITION'の値と同じかどうかはわかりませんが、以下ではそのように使用しています。

これが私が見つけた他のいくつかの回答のわずかなバリエーションです-テーブル内の列の「位置」または順序が私のアプリケーションで重要であるため、これを使用します-私は基本的に「列(n)が何と呼ばれるかを知る必要があります? '

sp_columnsは無関係な要素をすべて返します。T-SQL関数よりもselectを使用する方が便利なので、次のようにしました。

select    
  syscolumns.name, 
  syscolumns.colid    
from     
  sysobjects, syscolumns  
where 
  sysobjects.id = syscolumns.id and   
  sysobjects.xtype = 'u' and   
  sysobjects.name = '<YOUR_TABLE>' 
order by syscolumns.colid 

私は長い間この方法を使用していましたが、反対のアドバイスを受けました。実際、私は言われたとおりの問題にぶつかりました... MSSQLの新しいバージョンが構文を変更する可能性が高いです。たとえば、私が最初にこの手法を使用したバージョンでは、sys.objectおよびsys.columnsでした。おそらく、スキーマとストアドプロシージャのメソッドは、これに対するより多くの証拠です...確かではありませんが、これまでのところ非常に優れています。
RosieC 2016

1

@Gulzar Nazimの答えはすばらしいですが、データベース名をクエリに含める方がおそらく簡単です。これは、次のSQLで実現できます。

SELECT COLUMN_NAME, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'you-table-name' AND TABLE_CATALOG='your-database-name'

1

以下のコードを使用して、すべての列名を出力できます。コードを変更して、好きな形式で他の詳細を印刷することもできます

    declare @Result varchar(max)='
            '
            select @Result=@Result+''+ColumnName+'
            '
            from
            (
                select
                    replace(col.name, ' ', '_') ColumnName,
                    column_id ColumnId
                from sys.columns col
                    join sys.types typ on
                        col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
                where object_id = object_id('tblPracticeTestSections')
            ) t
            order by ColumnId
            print @Result

出力

column1
column2
column3
column4

C#クラスと同じコードを使用してテーブルとその列名を出力するには、次のコードを使用します。

    declare @TableName sysname = '<EnterTableName>'
    declare @Result varchar(max) = 'public class ' + @TableName + '
    {'

    select @Result = @Result + '
        public static string ' + ColumnName + ' { get { return "'+ColumnName+'"; } }
    '
    from
    (
        select
            replace(col.name, ' ', '_') ColumnName,
            column_id ColumnId
        from sys.columns col
            join sys.types typ on
                col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
        where object_id = object_id(@TableName)
    ) t
    order by ColumnId

    set @Result = @Result  + '
    }'

    print @Result

出力:

 public class tblPracticeTestSections
 {
   public static string column1 { get { return "column1"; } }

   public static string column2{ get { return "column2"; } }

   public static string column3{ get { return "column3"; } }

   public static string column4{ get { return "column4"; } }

 } 

0

私は、マーティン・スミスが述べたようなクエリを使用していますが、少し短いだけです。

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'


0

以来SYSCOLUMNS廃止されて、使用することをSys.All_Columns

Select  
 ObjectName       = Object_Name(Object_ID)  
,T.Name  
,C.*  
,T.*  
From   
           Sys.All_Columns C  
Inner Join Sys.Types       T  On T.User_Type_Id = C.User_Type_Id  
Where [Object_ID] = Object_ID('Sys.Server_Permissions')  
--Order By Name Asc  

Select * From Sys.Typesuser_type_id = IDタイプの利回り になります。これはデータベース内で一意です。システム・データ・タイプの場合:user_type_id = system_type_id


0
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
SELECT @col;

0

postgresqlを使用している場合、複数のスキーマに同じ名前のテーブルがある可能性があります。その場合、以下のクエリを適用してください。

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;

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