Como posso obter nomes de colunas de uma tabela no SQL Server?


715

Gostaria de consultar o nome de todas as colunas de uma tabela. Eu descobri como fazer isso em:

Mas preciso saber: como isso pode ser feito no Microsoft SQL Server (2008 no meu caso)?


48
Como um truque rápido e sujo, eu realmente gosto de fazerSELECT * FROM my_table WHERE 1=0
bgusach

12
@bgusach - Parece que o usuário queria os nomes das colunas como linhas em uma tabela, mas para o que você está tentando fazer, SELECT TOP 0 * FROM my_tableé menos teclas digitadas
Jake Wood

@bgusach: Isso soa como uma resposta para mim. Você deve publicá-lo.
palswim

Respostas:


863

Você pode obter essas informações e muito mais consultando as visualizações do esquema de informações .

Esta consulta de exemplo:

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

Pode ser feito sobre todos esses objetos de banco de dados:


25
o que significa "N" em "= N'Customers '"?
Qbik

20
Qbik "N" se por Handlling string unicode como varchar em ANSI (32 bits) e nvarchar em unicode (64bit)
thatsalok

9
confirmado: funciona para MariaDB também! :) (sem Nortwind....)
jave.web 31/03

5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';isso funciona para mim
Pavol Travnik

1
Eu tive que usar, TABLE_SCHEMA = '?' AND TABLE_NAME = '?'pois estou no host local e tenho várias tabelas com o mesmo nome, mas em bancos de dados diferentes.
Akinuri 25/10/19

194

Você pode usar o procedimento armazenado sp_columns, que retornaria informações pertencentes a todas as colunas para uma determinada tabela. Mais informações podem ser encontradas aqui http://msdn.microsoft.com/en-us/library/ms176077.aspx

Você também pode fazer isso através de uma consulta SQL. Algo assim deve ajudar:

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

Ou uma variação seria:

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

Isso obtém todas as colunas de todas as tabelas, ordenadas pelo nome da tabela e depois no nome da coluna.


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

Isso é melhor do que obter, sys.columnsporque mostra DATA_TYPEdiretamente.


5
+1, uma vez que esse é o padrão ANSI SQL ( en.wikipedia.org/wiki/Information_schema ) Outras respostas como sys.objects não são padrão
Reversed Engineer

E se a tabela estiver em outro esquema (a variante "schema" do servidor SQL), adicione AND TABLE_SCHEMA = 'schemaName'a WHEREcláusula
21416 Johan Johan

Muito útil, e você pode adicionar JOIN sys.types t on c.system_type_id = t.system_type_ide adicionar t.namesua instrução 'SELECT' para obter os tipos ao lado do nome de cada coluna também.
precisa saber é

56

Você pode usar sp_helpno SQL Server 2008.

sp_help <table_name>;

Atalho do teclado para o comando acima: selecione o nome da tabela (ou seja, destaque-o) e pressione ALT+ F1.


1
este é o meu atalho de teclado favorito de todos os tempos. Também atribuo sp_helptext ao Cntl-F1. Juntos, esses dois atalhos economizam muito tempo!
Paul Wehland

44

Ao usar esta consulta, você obtém a resposta:

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

35

Você pode escrever esta consulta para obter o nome da coluna e todos os detalhes sem usar o INFORMATION_SCHEMA no MySql:

SHOW COLUMNS FROM database_Name.table_name;

7
@ Benjamin, porque esta pergunta é para o SQL Server e esta resposta é para o MySql
Caimen

1
Pode ser que a maioria das pessoas que usa o MySql enfrenta esse problema. E eu mencionei isso. Eu estou usando o MySql.
Sachin Parse

5
Não importa se a maioria das pessoas que usa outros RDBMSes tem o mesmo problema, isso é irrelevante para a pergunta original e leva as respostas relevantes mais adiante.
Demonblack 4/18

1
I downvote porque a questão é especificamente endereço para 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 é sua mesa


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

Esta questão SO está faltando a seguinte abordagem:

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

10

Ele irá verificar se o dado tableé a tabela base .

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

Você pode tentar isso. Isso fornece todos os nomes de colunas com seus respectivos tipos de dados.

desc <TABLE NAME> ;

Eu sei que isso funciona no Oracle. Mas isso funciona no Microsft SQL? Obrigado.
DxTx

6

você pode usar esta consulta

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

6
SELECT c.Name 
FROM sys.columns c
JOIN sys.objects o ON o.object_id = c.object_id
WHERE o.object_id = OBJECT_ID('TABLE_NAME')
ORDER BY c.Name

5

Uma outra opção que é sem dúvida mais intuitiva é:

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

Isso fornece todos os nomes de suas colunas em uma única coluna. Se você se preocupa com outros metadados, pode alterar a edição de SELECT STATEMENT TO SELECT *.


3

Resumindo as respostas

Eu posso ver muitas respostas diferentes e maneiras de fazer isso, mas há um problema nisso e esse é o objective.

Sim, o objetivo. Se você quiser only knowos nomes das colunas, poderá usar

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

Mas se você quiser useessas colunas em algum lugar ou simplesmente dizê- manipulatelas, as consultas rápidas acima não serão úteis. Você precisa usar

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

mais uma maneira de conhecer algumas colunas específicas nas quais precisamos de algumas colunas semelhantes

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

1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'

Outras respostas são iguais.
Kiquenet

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

Simples e não requer nenhuma tabela sys

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.