Come posso ottenere i nomi di colonna da una tabella in SQL Server?


715

Vorrei interrogare il nome di tutte le colonne di una tabella. Ho trovato come farlo in:

Ma devo sapere: come si può fare in Microsoft SQL Server (2008 nel mio caso)?


48
Come trucco rapido e sporco, mi piace molto fareSELECT * FROM my_table WHERE 1=0
bgusach,

12
@bgusach - Sembra che l'utente volesse i nomi delle colonne come righe in una tabella, ma per quello che stai cercando di fare, SELECT TOP 0 * FROM my_tablesono meno sequenze di tasti
Jake Wood

@bgusach: Mi sembra una risposta. Dovresti pubblicarlo.
palswim

Risposte:


863

È possibile ottenere queste informazioni e molto altro ancora eseguendo una query sulle viste dello Schema informazioni .

Questa query di esempio:

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

Può essere creato su tutti questi oggetti DB:


25
cosa significa "N" in "= N'Customers '"?
Qbik,

20
Qbik "N" se per handlling stringa unicode come varchar in ANSI (32 bit) e nvarchar in unicode (64 bit)
thatsalok

9
confermato: funziona anche per MariaDB ! :) (senza Nortwind....)
jave.web

5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';questo funziona per me
Pavol Travnik

1
Ho dovuto usare TABLE_SCHEMA = '?' AND TABLE_NAME = '?'poiché sono su localhost e ho più tabelle con lo stesso nome ma in database diversi.
akinuri,

194

È possibile utilizzare la stored procedure sp_columns che restituirebbe informazioni relative a tutte le colonne per una determinata tabella. Ulteriori informazioni sono disponibili qui http://msdn.microsoft.com/en-us/library/ms176077.aspx

Puoi anche farlo con una query SQL. Qualcosa del genere dovrebbe aiutare:

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

O una variazione sarebbe:

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

Questo ottiene tutte le colonne da tutte le tabelle, ordinate per nome della tabella e quindi per nome della colonna.


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

Questo è meglio che ottenere sys.columnsperché mostra DATA_TYPEdirettamente.


5
+1 poiché questo è ANSI SQL standard ( en.wikipedia.org/wiki/Information_schema ) Altre risposte come sys.objects non sono standard
Ingegnere invertito

E se la tabella si trova in un altro schema (la variante "schema" del server SQL) aggiungi AND TABLE_SCHEMA = 'schemaName'la WHEREclausola.
Johan,

Molto utile e puoi aggiungere JOIN sys.types t on c.system_type_id = t.system_type_ide aggiungere t.namel'istruzione 'SELECT' per ottenere anche i tipi accanto al nome di ogni colonna.
Pac0,

56

È possibile utilizzare sp_helpin SQL Server 2008.

sp_help <table_name>;

Scorciatoia da tastiera per il comando precedente: selezionare il nome della tabella (ovvero evidenziarlo) e premere ALT+ F1.


1
questa è la mia scorciatoia da tastiera preferita di tutti i tempi. Assegno anche sp_helptext a Cntl-F1. Insieme, queste due scorciatoie fanno risparmiare molto tempo!
Paul Wehland,

44

Usando questa query ottieni la risposta:

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

35

Puoi scrivere questa query per ottenere il nome della colonna e tutti i dettagli senza utilizzare INFORMATION_SCHEMA in MySql:

SHOW COLUMNS FROM database_Name.table_name;

7
@Benjamin, perché questa domanda è per SQL Server e questa risposta è per MySql
Caimen

1
Potrebbe essere la maggior parte delle persone che usano MySql, deve affrontare questo problema. E l'ho menzionato. Sto usando MySql.
Sachin Parse,

5
Non importa se la maggior parte delle persone che usano altri RDBMS hanno lo stesso problema, è irrilevante per la domanda originale e spinge le risposte pertinenti più in basso.
Demonblack,

1
Ho espresso il mio voto negativo perché la domanda è specificamente rivolta 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 è il tuo tavolo


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 questa domanda SO manca il seguente approccio:

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

10

Verificherà se la data tableè la tabella di 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

Puoi provare questo. Ciò fornisce tutti i nomi di colonna con i rispettivi tipi di dati.

desc <TABLE NAME> ;

So che funziona in Oracle. Ma questo funziona in Microsft SQL? Grazie.
DxTx,

6

puoi usare questa query

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

Un'altra opzione che è probabilmente più intuitiva è:

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

Questo ti dà tutti i nomi delle colonne in una singola colonna. Se vi preoccupate per altri metadati, è possibile modificare modificare l'istruzione SELECT per SELECT *.


3

Riassumendo le risposte

Vedo molte risposte e modi diversi per farlo, ma c'è il problema in questo e quello è il objective.

Sì, l'obiettivo. Se vuoi only knowi nomi delle colonne puoi usare

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

Ma se vuoi usequelle colonne da qualche parte o semplicemente dirle manipulate, le domande rapide sopra non saranno di alcuna utilità. Devi usare

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

un altro modo per conoscere alcune colonne specifiche in cui abbiamo bisogno di alcune colonne simili

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'

Altre risposte sono le stesse.
Kiquenet,

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

Semplice e non richiede alcuna tabella di sistema

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.