¿Cómo devuelve los nombres de columna de una tabla?

239

¿Cómo devolvería los nombres de columna de una tabla con SQL Server 2008? es decir, una tabla contiene estas columnas: id, nombre, dirección, país y deseo devolverlas como datos.

Belliez
fuente

Respuestas:

400

No estoy seguro si hay una manera más fácil en la versión 2008.

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'
Gulzar Nazim
fuente
66
¿Qué es el 'YourSchemaName'?
Drewdin
12
'YourSchemaName' es el esquema de la tabla en la que está consultando. Ejemplo: dbo.myTable, 'dbo' es el esquema al que pertenece 'myTable'. Los esquemas facilitan la asignación de permisos a una agrupación en lugar de a cada tabla individualmente. Consulte también esta pregunta: stackoverflow.com/questions/1062075/…
jmosesman
3
No se olvide el comando USE DatabaseName lo contrario se puede buscar en la base de datos maestra o diferente de lo que quiere
Muflix
1
SELECCIONE COLUMN_NAME, * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' Y TABLE_SCHEMA = 'dbo'
Usman Younas
112

Esta es la manera más fácil

exec sp_columns [tablename]
DiggDev
fuente
2
Esto es corto y simple, debería ser la respuesta correcta. Me imagino que no existía cuando la pregunta se hizo originalmente :)
DanteTheSmith
1
Si su esquema no es dbo, debe pasarlo como un parámetro adicional. ejecutivo sp_columns [TableName], @table_owner = [esquema]
Pradeep
32

¿Algo como esto?

sp_columns @table_name=your table name
Paul Lefebvre
fuente
13

Un método es 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
splattne
fuente
1
Realmente me gusta esta. Sin Objtypeembargo, encuentro la columna redundante :)
Joel
1
¿No sería mejor escribir por completo la unión (sysobjects so inner join syscolumns sc en so.id = sc.id)? Esto parece una respuesta perezosa a expensas del rendimiento. Podría estar equivocado ...
Losbear
1
@Losbear lo cambió. PD: No es vago, es solo código de hace 8 años. :) En los viejos tiempos (usaba SQL Server a partir de la versión 4.2), solía escribir consultas SQL de esta manera. Sin problemas de rendimiento.
splattne
9

Esto parece un poco más fácil que las sugerencias anteriores porque usa la función OBJECT_ID () para ubicar la identificación de la tabla. Cualquier columna con esa identificación es parte de la tabla.

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

Normalmente uso una consulta similar para ver si una columna que conozco es parte de una versión más nueva está presente. Es la misma consulta con la adición de {AND name = 'YOUR_COLUMN'} a la cláusula where.

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

prueba esto

select * from <tablename> where 1=2

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

Shanmugam Sudalaimuthu
fuente
Interesante, pero ¿cuál es la lógica detrás de esto?
nilakantha singh deo
@nilakanthasinghdeo, la lógica es que siempre devolverá cero filas con WHERE 1=2y aún devolverá los metadatos de la columna. Si usa una interfaz programática como ODBC, entonces esta información de columna es accesible como una lista / matriz desde el objeto cursor dentro del programa, que es lo que estaba buscando. Puede que no tenga sentido en un contexto SQL puro, pero es un enfoque sucinto cuando se conecta a una base de datos a través de Python / Java / C / etc.
Arthur Hebert
5

Lo siguiente parece ser la primera consulta sugerida anteriormente, pero en algún momento debe especificar la base de datos para que funcione. Tenga en cuenta que la consulta también debería funcionar sin especificar TABLE_SCHEMA:

SELECT COLUMN_NAME
FROM   YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'
Edi Mohseni
fuente
4

yo suelo

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%'
Scott K.
fuente
3

¿Por qué no probar esto?

haga clic derecho en la tabla -> Tabla de secuencia de comandos como -> Crear para -> ¿Nueva ventana del editor de consultas?

La lista completa de columnas se proporciona en el script. Cópielo y use los campos según sea necesario.

angieb1008
fuente
3
El autor probablemente quería saber cómo obtener los nombres de columna de la tabla mediante programación para su uso en un procedimiento almacenado u otro script.
KLee1
1
La respuesta indica que "I want to return these as data", aunque su respuesta obtendrá los valores, es probable que el OP quiera los datos en tiempo de ejecución.
StuperUser
2

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

Deepan Kanugula
fuente
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
Rishikesh
fuente
2
Bienvenido a SO! Pero parece que esta pregunta ya recibió una respuesta satisfactoria hace unos tres años ... Además, cuando publique el código, use {} para resaltarlo. Eche un vistazo a las Preguntas frecuentes, tiene buena información sobre cómo comenzar aquí: stackoverflow.com/faq
Valentino Vranken
1

No estoy seguro de si el valor syscolumns.colid es el mismo que el valor 'ORDINAL_POSITION' devuelto como parte de sp_columns, pero en lo que sigue lo estoy usando de esa manera, espero no estar desinformando ...

Aquí hay una ligera variación en algunas de las otras respuestas que he encontrado: lo uso porque la 'posición' u orden de la columna en la tabla es importante en mi aplicación, básicamente necesito saber '¿Cómo se llama la columna (n)? ?

sp_columns devuelve un montón de cosas extrañas, y soy más útil con una selección que las funciones T-SQL, así que seguí esta ruta:

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 
Jake
fuente
Utilicé este método durante mucho tiempo, pero me desaconsejaron. De hecho, llegué al problema exacto que me dijeron que podría ... es más probable que las nuevas versiones de MSSQL cambien la sintaxis. Por ejemplo, solía ser sys.object y sys.columns en las versiones en las que usé esta técnica por primera vez. Supuestamente, el esquema y los métodos de procedimiento almacenado son una prueba más de esto ... no estoy seguro, pero hasta ahora todo bien.
RosieC
1

Si bien la respuesta de @Gulzar Nazim es excelente, probablemente sea más fácil incluir el nombre de la base de datos en la consulta, lo que podría lograrse con el siguiente SQL.

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

Puede usar el siguiente código para imprimir todos los nombres de columna; También puede modificar el código para imprimir otros detalles en el formato que desee

    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

Salida

column1
column2
column3
column4

Para usar el mismo código para imprimir la tabla y el nombre de su columna como clase C #, use el siguiente código:

    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

Salida:

 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"; } }

 } 
Atal Kishore
fuente
0

Solo uso una consulta como Martin Smith mencionó, solo un poco más corta:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'
Marcel Grolms
fuente
0
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'
Vishal Kiri
fuente
0

Como SysColumns está en desuso , 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.Typescederá user_type_id = IDdel tipo. Esto es único dentro de la base de datos. Para los tipos de datos del sistema: user_type_id = system_type_id.

Denzil Boggs
fuente
0
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
SELECT @col;
M Thiyanithi
fuente
0

SI está trabajando con postgresql, existe la posibilidad de que más de un esquema pueda tener una tabla con el mismo nombre en ese caso, aplique la consulta a continuación

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;
abhinav kumar
fuente
-3
set fmtonly on
select * from yourTable
Jimbo
fuente