¿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)?


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:


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.


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

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


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.


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'

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;

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

22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME es tu 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

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')

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'

10

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

desc <TABLE NAME> ;

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]'

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

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 *.


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]'

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.