Como você retorna os nomes das colunas de uma tabela?


239

Como eu retornaria os nomes das colunas de uma tabela usando o SQL Server 2008? ou seja, uma tabela contém essas colunas - id, nome, endereço, país e eu quero devolvê-las como dados.

Respostas:


399

Não tenho certeza se existe uma maneira mais fácil na versão 2008.

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

6
O que é o 'YourSchemaName'?
Drewdin

12
'YourSchemaName' é o esquema da tabela na qual você está consultando. Exemplo: dbo.myTable, 'dbo' é o esquema ao qual 'myTable' pertence. Os esquemas facilitam a atribuição de permissões a um agrupamento, em vez de cada tabela individualmente. Veja também esta pergunta: stackoverflow.com/questions/1062075/…
jmosesman

3
Não se esqueça de comando use DatabaseName caso contrário, você pode pesquisar no mestre ou banco de dados diferente do que você quer
Muflix

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

112

Esta é a maneira mais fácil

exec sp_columns [tablename]

2
Isso é curto e simples, deve ser a resposta correta. Imagino que não existia quando pergunta foi feita originalmente :)
DanteTheSmith

1
Se o seu esquema não for dbo, você deve passá-lo como um parâmetro adicional. exec sp_columns [TableName], @table_owner = [schema]
Pradeep


13

Um método é consultar 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
Eu realmente gosto deste. Acho Objtyperedundante coluna, embora :)
Joel

1
Não seria melhor escrever totalmente a junção (sysobjects para junção interna syscolumns sc em so.id = sc.id)? Parece uma resposta preguiçosa à custa do desempenho. Eu posso estar errado ...
Losbear

1
@ Losbear mudou PS: Não é preguiçoso, é apenas o código de 8 anos atrás. :) Antigamente (eu usava o SQL Server a partir da versão 4.2), escrevia consultas SQL dessa maneira. sem problemas de desempenho.
splattne

9

Isso parece um pouco mais fácil do que as sugestões acima, porque ele usa a função OBJECT_ID () para localizar o ID da tabela. Qualquer coluna com esse ID faz parte da tabela.

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

Normalmente, uso uma consulta semelhante para verificar se uma coluna que eu sei que faz parte de uma versão mais recente está presente. É a mesma consulta com a adição de {AND name = 'YOUR_COLUMN'} à cláusula where.

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

8

tente isso

select * from <tablename> where 1=2

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


Interessante, mas qual é a lógica por trás disso?
Nilakantha singh deo 03/04

@nilakanthasinghdeo, a lógica é que ele sempre retornará zero linhas WHERE 1=2e ainda retornará os metadados da coluna. Se você estiver usando uma interface programática como ODBC, as informações desta coluna poderão ser acessadas como uma lista / matriz do objeto cursor dentro do programa, que é o que eu estava procurando. Pode não fazer sentido em um contexto SQL puro, mas é uma abordagem sucinta ao se conectar a um banco de dados via Python / Java / C / etc.
Arthur Hebert

5

A seguir, parece ser a primeira consulta sugerida acima, mas em algum momento é necessário especificar o banco de dados para que ele funcione. Observe que a consulta também deve funcionar sem especificar o 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

eu uso

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

Por que não apenas tentar isso:

clique com o botão direito na tabela -> Tabela de scripts como -> Criar para -> Nova janela do editor de consultas?

A lista inteira de colunas é fornecida no script. Copie-o e use os campos conforme necessário.


3
O autor provavelmente queria saber como obter os nomes das colunas da tabela programaticamente para uso em um procedimento armazenado ou outro script.
KLee1

1
A resposta indica que "I want to return these as data", embora sua resposta obtenha os valores, é provável que o OP deseje os dados em tempo de execução.
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
Bem-vindo ao SO! Mas parece que essa pergunta já obteve uma resposta satisfatória há cerca de três anos ... Além disso, ao postar o código, use o {} para destacá-lo. Ter um olhar para o FAQ, ele tem algumas boas informações sobre como começar aqui: stackoverflow.com/faq
Valentino Vranken

1

Não tenho certeza se o valor syscolumns.colid é o mesmo que o valor 'ORDINAL_POSITION' retornado como parte de sp_columns, mas, a seguir, estou usando dessa maneira - espero não estar desinformando ...

Aqui está uma pequena variação em algumas das outras respostas que encontrei - eu uso isso porque a 'posição' ou ordem da coluna na tabela é importante no meu aplicativo - basicamente preciso saber 'Como é chamada a coluna (n) ?

sp_columns retorna um monte de coisas estranhas, e eu sou mais habilidoso com funções select do que T-SQL, então segui esta rota:

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 

Eu usei esse método por um longo tempo, mas fui desaconselhado. Na verdade, eu bati no problema exato que me disseram que poderia ... é mais provável que novas versões do MSSQL alterem a sintaxe. Por exemplo, costumava ser sys.object e sys.columns nas versões em que usei essa técnica pela primeira vez. Supostamente, o esquema e os métodos de procedimento armazenado são mais uma prova disso ... não tenho certeza, mas até agora tudo bem.
RosieC

1

Embora a resposta do @Gulzar Nazim seja ótima, provavelmente é mais fácil incluir o nome do banco de dados na consulta, o que pode ser alcançado pelo SQL a seguir.

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

1

Você pode usar o código abaixo para imprimir todos os nomes de colunas; Você também pode modificar o código para imprimir outros detalhes no formato que desejar.

    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

Resultado

column1
column2
column3
column4

Para usar o mesmo código para imprimir a tabela e seu nome de coluna como classe C #, use o código abaixo:

    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

Resultado:

 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

Eu apenas uso uma consulta como Martin Smith mencionou, apenas um pouco mais curta:

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

0
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'

0

Como SysColumns está obsoleto , use 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.Typesproduzirá user_type_id = IDdo tipo. Isso é único dentro do banco de dados. Para os tipos de dados do sistema: 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

Se você estiver trabalhando com o postgresql, existe a possibilidade de que mais de um esquema possa ter uma tabela com o mesmo nome; nesse caso, aplique a consulta abaixo

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.