Come si restituiscono i nomi delle colonne di una tabella?


239

Come restituirei i nomi delle colonne di una tabella usando SQL Server 2008? cioè una tabella contiene queste colonne id, nome, indirizzo, paese e voglio restituirle come dati.

Risposte:


400

Non sono sicuro che ci sia un modo più semplice nella versione 2008.

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

6
Che cos'è "YourSchemaName"?
Drewdin,

12
"YourSchemaName" è lo schema per la tabella a cui stai eseguendo una query. Esempio: dbo.myTable, 'dbo' è lo schema a cui appartiene 'myTable'. Gli schemi semplificano l'assegnazione delle autorizzazioni a un raggruppamento anziché a ciascuna tabella singolarmente. Vedere questa domanda anche: stackoverflow.com/questions/1062075/...
jmosesman

3
Non dimenticare il comando USE DatabaseName, altrimenti puoi cercare nel database master o diverso da quello che vuoi
Muflix

1
SELEZIONA COLUMN_NAME, * DA INFORMATION_SCHEMA.COLUMNS DOVE TABLE_NAME = 'YourTableName' E TABLE_SCHEMA = 'dbo'
Usman Younas il

112

Questo è il modo più semplice

exec sp_columns [tablename]

2
Questa è breve e semplice, dovrebbe essere la risposta corretta. Immagino che non esistesse quando la domanda fu inizialmente posta :)
DanteTheSmith

1
Se lo schema non è dbo, è necessario passarlo come parametro aggiuntivo. exec sp_columns [TableName], @table_owner = [schema]
Pradeep


13

Un metodo è quello di interrogare 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
Mi piace molto questo. Trovo la Objtypecolonna ridondante, però :)
Joel

1
Non sarebbe meglio scrivere completamente il join (sysobjects so inner join syscolumns sc su so.id = sc.id)? Sembra una risposta pigra a scapito delle prestazioni. Potrei sbagliarmi ...
Losbear,

1
@Losbear l'ha cambiato PS: non è pigro, è solo un codice di 8 anni fa. :) In passato (ho usato SQL Server a partire dalla versione 4.2), scrivevo query SQL in questo modo. nessun problema di prestazioni.
splattne,

9

Questo sembra un po 'più semplice dei suggerimenti precedenti perché utilizza la funzione OBJECT_ID () per individuare l'id della tabella. Qualsiasi colonna con quell'id fa parte della tabella.

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

Uso comunemente una query simile per vedere se è presente una colonna che conosco fa parte di una versione più recente. È la stessa query con l'aggiunta di {AND name = 'YOUR_COLUMN'} alla clausola where.

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

8

prova questo

select * from <tablename> where 1=2

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


Interessante, ma qual è la logica alla base?
nilakantha singh deo,

@nilakanthasinghdeo, la logica è che restituirà sempre zero righe WHERE 1=2e restituirà comunque i metadati della colonna. Se si utilizza un'interfaccia programmatica come ODBC, le informazioni di questa colonna sono accessibili come elenco / matrice dall'oggetto cursore all'interno del programma, che è quello che stavo cercando. Potrebbe non avere senso in un contesto SQL puro, ma è un approccio sintetico quando ci si connette a un database tramite Python / Java / C / ecc.
Arthur Hebert,

5

Quanto segue sembra essere come la prima query suggerita sopra ma a volte è necessario specificare il database per farlo funzionare. Si noti che la query dovrebbe funzionare anche senza specificare 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

Io 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

Perché non provi questo:

fare clic con il tasto destro sulla tabella -> Tabella script come -> Crea in -> Nuova finestra dell'editor di query?

L'intero elenco di colonne è riportato nello script. Copialo e usa i campi come necessario.


3
L'autore probabilmente voleva sapere come ottenere i nomi delle colonne dalla tabella a livello di codice per l'uso in una procedura memorizzata o in altri script.
KLee1

1
La risposta indica "I want to return these as data", mentre la risposta otterrà i valori, è probabile che l'OP voglia i dati in fase di esecuzione.
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
Benvenuti in SO! Ma sembra che questa domanda abbia già avuto una risposta soddisfacente circa tre anni fa ... Inoltre, quando pubblichi un codice, usa {} per evidenziarlo. Dai un'occhiata alle FAQ, ha alcune informazioni utili per iniziare qui: stackoverflow.com/faq
Valentino Vranken,

1

Non sono sicuro che il valore syscolumns.colid sia uguale al valore "ORDINAL_POSITION" restituito come parte di sp_columns, ma in seguito lo sto usando in questo modo - spero di non essere male informato ...

Ecco una leggera variazione su alcune delle altre risposte che ho trovato - lo uso perché la 'posizione' o l'ordine della colonna nella tabella è importante nella mia applicazione - Fondamentalmente ho bisogno di sapere 'Come si chiama la colonna (n) ?'

sp_columns restituisce un sacco di cose estranee, e sono più maneggevole con una selezione di funzioni T-SQL, quindi ho seguito questa strada:

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 

Ho usato questo metodo per molto tempo, ma mi è stato sconsigliato. In effetti ho riscontrato l'esatto problema che mi è stato detto che avrei potuto ... è più probabile che le nuove versioni di MSSQL cambino la sintassi. Ad esempio era sys.object e sys.columns nelle versioni su cui ho usato questa tecnica per la prima volta. Presumibilmente lo schema e i metodi della procedura memorizzata sono più prove contro questo ... non sono sicuro, ma finora tutto bene.
RosieC,

1

Sebbene la risposta di @Gulzar Nazim sia ottima, è probabilmente più facile includere il nome del database nella query, che potrebbe essere ottenuto dal seguente SQL.

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

1

È possibile utilizzare il codice seguente per stampare tutti i nomi di colonna; Puoi anche modificare il codice per stampare altri dettagli nel formato che preferisci

    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

Produzione

column1
column2
column3
column4

Per utilizzare lo stesso codice per stampare la tabella e il nome della colonna della classe C #, utilizzare il codice seguente:

    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

Produzione:

 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

Uso solo una query come menzionato Martin Smith, solo un po 'più breve:

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

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

0

Poiché SysColumns è obsoleto , utilizzare 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.Typesprodurrà user_type_id = IDdel tipo. Questo è unico nel database. Per i tipi di dati di 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 stai lavorando con postgresql c'è la possibilità che più di uno schema possa avere una tabella con lo stesso nome in quel caso applicare la query qui sotto

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.