테이블의 열 이름을 어떻게 반환합니까?


239

SQL Server 2008을 사용하여 테이블의 열 이름을 어떻게 반환합니까? 즉, 테이블에는 이러한 열-id, 이름, 주소, 국가가 포함되어 있으며 데이터로 반환하고 싶습니다.

답변:


400

2008 버전에 더 쉬운 방법이 있는지 확실하지 않습니다.

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

6
'YourSchemaName'은 무엇입니까?
Drewdin

12
'YourSchemaName'은 쿼리하려는 테이블의 스키마입니다. 예 : dbo.myTable, 'dbo'는 'myTable'이 속한 스키마입니다. 스키마를 사용하면 각 테이블 대신 개별적으로 그룹에 권한을 쉽게 할당 할 수 있습니다. 또한이 질문을 참조하십시오 stackoverflow.com/questions/1062075/...
jmosesman

3
USE DatabaseName 명령을 잊지
마십시오.

1
SELECT COLUMN_NAME, * From INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName'AND TABLE_SCHEMA = 'dbo'–
Usman

112

가장 쉬운 방법입니다

exec sp_columns [tablename]

2
이것은 짧고 간단하며 정답이어야합니다. 나는 질문이 원래 요청되었을 때 존재하지 않았다고 상상한다 :)
DanteTheSmith

1
스키마가 dbo가 아닌 경우 추가 매개 변수로 전달해야합니다. exec sp_columns [TableName], @table_owner = [schema]
Pradeep


13

한 가지 방법은 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그래도 중복 열을 찾습니다. :
Joel

1
조인을 완전히 작성하는 것이 낫지 않습니까 (sysobjects 그래서 내부 조인 syscolumns sc on so.id = sc.id)? 이것은 성능을 희생시키면서 게으른 답변처럼 보입니다. 내가 틀렸을 수도 ...
Losbear

1
@Losbear는 그것을 PS로 바꿨습니다. 게으른 것이 아니라 8 년 전의 코드 일뿐입니다. :) 예전에는 (버전 4.2부터 SQL Server를 사용했습니다), SQL 쿼리를 이런 식으로 쓰는 데 사용했습니다. 성능 문제가 없습니다.
splattne

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

@nilakanthasinghdeo, 논리는 항상 0 행을 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

2

USE[Database] SELECT TABLE_NAME,TABLE_SCHEMA,[Column_Name],[Data_type] FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='dbo'


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

1

@Gulzar Nazim의 대답은 훌륭하지만 쿼리에 데이터베이스 이름 을 포함시키는 것이 더 쉬울 것입니다 . 이는 다음 SQL을 통해 얻을 수 있습니다.

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

1

아래 코드를 사용하여 모든 열 이름을 인쇄 할 수 있습니다. 또한 형식 u와 같은 다른 세부 정보를 인쇄하도록 코드를 수정할 수 있습니다

    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

Martin Smith가 언급 한 것과 같은 쿼리를 사용합니다.

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.