¿Cómo puedo obtener los nombres de columna de una tabla en SQL Server?

715

Me gustaría consultar el nombre de todas las columnas de una tabla. Encontré cómo hacer esto en:

Pero necesito saber: ¿cómo se puede hacer esto en Microsoft SQL Server (2008 en mi caso)?

odiseh
fuente
48
Como un truco rápido y sucio, me gusta muchoSELECT * FROM my_table WHERE 1=0
bgusach
12
@bgusach - Parece que el usuario quería los nombres de las columnas como filas en una tabla, pero para lo que está tratando de hacer, SELECT TOP 0 * FROM my_tablees menos pulsaciones de teclas
Jake Wood
@bgusach: Eso me parece una respuesta. Deberías publicarlo.
palswim

Respuestas:

863

Puede obtener esta información y mucho, mucho más consultando las vistas del esquema de información .

Esta consulta de muestra:

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

Se puede realizar sobre todos estos objetos de base de datos:

Luke Burns
fuente
25
¿Qué significa "N" en "= N'Customers '"?
Qbik
20
Qbik "N" si por Handlling cadena Unicode como varchar en ANSI (32 bits) y nvarchar en Unicode (64 bits)
thatsalok
99
confirmado: ¡también funciona para MariaDB ! :) (sin Nortwind....)
jave.web
55
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';esto funciona para mí
Pavol Travnik
1
Tuve que usar TABLE_SCHEMA = '?' AND TABLE_NAME = '?'ya que estoy en localhost y tengo varias tablas con el mismo nombre pero en diferentes bases de datos.
akinuri
194

Puede usar el procedimiento almacenado sp_columns que devolvería información relativa a todas las columnas para una tabla dada. Puede encontrar más información aquí http://msdn.microsoft.com/en-us/library/ms176077.aspx

También puede hacerlo mediante una consulta SQL. Algo como esto debería ayudar:

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

O una variación sería:

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

Esto obtiene todas las columnas de todas las tablas, ordenadas por nombre de tabla y luego por nombre de columna.

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

Esto es mejor que obtener sys.columnsporque se muestra DATA_TYPEdirectamente.

Limina
fuente
55
+1 ya que esto es ANSI SQL estándar ( en.wikipedia.org/wiki/Information_schema ) Otras respuestas como sys.objects no son estándar
Ingeniero invertido
Y si la tabla está en otro esquema (la variante "esquema" del servidor SQL) agregue AND TABLE_SCHEMA = 'schemaName'la WHEREcláusula.
Johan
Muy útil, y puede agregar JOIN sys.types t on c.system_type_id = t.system_type_idy agregar t.namesu declaración 'SELECCIONAR' para obtener los tipos junto al nombre de cada columna también.
Pac0
56

Puede usar sp_helpen SQL Server 2008.

sp_help <table_name>;

Método abreviado de teclado para el comando anterior: seleccione el nombre de la tabla (es decir, resáltelo) y presione ALT+ F1.

mr_eclair
fuente
1
Este es mi atajo de teclado favorito de todos los tiempos. También asigno sp_helptext a Cntl-F1. ¡Juntos, estos dos atajos ahorran mucho tiempo!
Paul Wehland
44

Al usar esta consulta, obtienes la respuesta:

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

Puede escribir esta consulta para obtener el nombre de columna y todos los detalles sin usar INFORMATION_SCHEMA en MySql:

SHOW COLUMNS FROM database_Name.table_name;
Sachin Parse
fuente
77
@Benjamin, porque esta pregunta es para SQL Server y esta respuesta es para MySql
Caimen
1
Puede ser que la mayoría de las personas que usan MySql se enfrenten a este problema. Y lo he mencionado. Estoy usando MySql.
Sachin Parse
55
No importa si la mayoría de las personas que usan otros RDBMS tienen el mismo problema, es irrelevante para la pregunta original y empuja las respuestas relevantes más abajo.
Demonblack
1
Voto abajo porque la pregunta es específicamente dirigida a 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
Doc
fuente
22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME es tu mesa

bstricks
fuente
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
Petko Petkov
fuente
12

Solo ejecuta este comando

EXEC sp_columns 'Your Table Name'
Hardeep Singh
fuente
2
no está dando el resultado deseado
Amit chauhan
11

A esta pregunta SO le falta el siguiente enfoque:

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

Verificará si la tabla basetable es la dada .

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'
Luv
fuente
10

Puede intentar esto. Esto proporciona todos los nombres de columna con sus respectivos tipos de datos.

desc <TABLE NAME> ;
ishaan arora
fuente
Sé que esto funciona en Oracle. Pero, ¿funciona esto en Microsft SQL? Gracias.
DxTx
6

puedes usar esta consulta

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
reza akhlaghi
fuente
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
Mohamed Raguig Labzour
fuente
5

Otra opción que podría decirse que es más intuitiva es:

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

Esto le da todos los nombres de sus columnas en una sola columna. Si le interesan otros metadatos, puede cambiar la edición de SELECT STATEMENT TO SELECT *.

Samuel Nde
fuente
3

Resumiendo las respuestas

Puedo ver muchas respuestas diferentes y formas de hacer esto, pero hay un problema en esto y ese es el objective.

Sí, el objetivo. Si desea only knowlos nombres de columna, puede usar

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

Pero si desea useesas columnas en algún lugar o simplemente decirlas manipulate, las consultas rápidas anteriores no serán de ninguna utilidad. Necesitas usar

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

Una forma más de conocer algunas columnas específicas donde necesitamos algunas columnas similares

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Shreekant
fuente
1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
onavascuez
fuente
Otras respuestas son las mismas.
Kiquenet
0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Simple y no requiere ninguna tabla sys

Hawkzey
fuente