Comment puis-je obtenir les noms de colonne d'une table dans SQL Server?

715

Je voudrais interroger le nom de toutes les colonnes d'une table. J'ai trouvé comment faire cela dans:

Mais j'ai besoin de savoir: comment faire cela dans Microsoft SQL Server (2008 dans mon cas)?

odiseh
la source
48
Comme une astuce rapide et sale, j'aime vraiment faireSELECT * FROM my_table WHERE 1=0
bgusach
12
@bgusach - On dirait que l'utilisateur voulait que les noms des colonnes soient des lignes dans une table, mais pour ce que vous essayez de faire, SELECT TOP 0 * FROM my_tablec'est moins de frappes
Jake Wood
@bgusach: Cela me semble être une réponse. Vous devez le poster.
palswim

Réponses:

863

Vous pouvez obtenir ces informations et bien plus encore en interrogeant les vues Schéma d'informations .

Cet exemple de requête:

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

Peut être créé sur tous ces objets DB:

Luke Burns
la source
25
que signifie "N" dans "= N'Customers '"?
Qbik
20
Qbik "N" if pour manipuler une chaîne unicode comme varchar en ANSI (32 bits) et nvarchar en unicode (64 bits)
thatsalok
9
confirmé: fonctionne aussi pour MariaDB ! :) (sans Nortwind....)
jave.web
5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';cela fonctionne pour moi
Pavol Travnik
1
J'ai dû utiliser TABLE_SCHEMA = '?' AND TABLE_NAME = '?'car je suis sur localhost et j'ai plusieurs tables avec le même nom mais dans différentes bases de données.
akinuri
194

Vous pouvez utiliser la procédure stockée sp_columns qui retournerait des informations relatives à toutes les colonnes d'une table donnée. Plus d'informations peuvent être trouvées ici http://msdn.microsoft.com/en-us/library/ms176077.aspx

Vous pouvez également le faire par une requête SQL. Quelque chose comme ça devrait aider:

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

Ou une variation serait:

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

Cela obtient toutes les colonnes de toutes les tables, triées par nom de table, puis par nom de colonne.

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

C'est mieux que de partir sys.columnscar cela se voit DATA_TYPEdirectement.

Limin
la source
5
+1 car il s'agit de SQL ANSI standard ( en.wikipedia.org/wiki/Information_schema ) D'autres réponses comme sys.objects ne sont pas standard
Reversed Engineer
Et si la table est dans un autre schéma (la variante "schéma" du serveur SQL), ajoutez AND TABLE_SCHEMA = 'schemaName'la WHEREclause.
Johan
Très utile, et vous pouvez ajouter JOIN sys.types t on c.system_type_id = t.system_type_idet ajouter t.namevotre instruction 'SELECT' pour obtenir également les types à côté du nom de chaque colonne.
Pac0
56

Vous pouvez utiliser sp_helpdans SQL Server 2008.

sp_help <table_name>;

Raccourci clavier pour la commande ci-dessus: sélectionnez le nom de la table (c.-à-d. Mettez-le en surbrillance) et appuyez sur ALT+ F1.

mr_eclair
la source
1
c'est mon raccourci clavier préféré de tous les temps. J'attribue également sp_helptext à Cntl-F1. Ensemble, ces deux raccourcis font gagner beaucoup de temps!
Paul Wehland
44

En utilisant cette requête, vous obtenez la réponse:

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

Vous pouvez écrire cette requête pour obtenir le nom de la colonne et tous les détails sans utiliser INFORMATION_SCHEMA dans MySql:

SHOW COLUMNS FROM database_Name.table_name;
Sachin Parse
la source
7
@Benjamin, car cette question est pour SQL Server et cette réponse est pour MySql
Caimen
1
Peut-être que la plupart des peuples utilisant MySql sont confrontés à ce problème. Et je l'ai mentionné. J'utilise MySql.
Sachin Parse
5
Peu importe si la plupart des personnes utilisant d'autres SGBDR ont le même problème, cela n'a rien à voir avec la question d'origine et pousse les réponses pertinentes plus loin.
Demonblack
1
Je downvote parce que la question est spécifiquement adressée à 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
la source
22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME est ta table

bstricks
la source
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
la source
12

Exécutez simplement cette commande

EXEC sp_columns 'Your Table Name'
Hardeep Singh
la source
2
ça
11

Cette question SO manque l'approche suivante:

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

Il vérifiera si le donné tableest la table de 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'
Luv
la source
10

Vous pouvez essayer ceci, ce qui donne tous les noms de colonnes avec leurs types de données respectifs.

desc <TABLE NAME> ;
ishaan arora
la source
Je sais que cela fonctionne dans Oracle. Mais cela fonctionne-t-il dans Microsft SQL? Je vous remercie.
DxTx
6

vous pouvez utiliser cette requête

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

Une autre option qui est sans doute plus intuitive est:

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

Cela vous donne tous les noms de vos colonnes dans une seule colonne. Si vous vous souciez d'autres métadonnées, vous pouvez modifier éditer le SELECT STATEMENT TO SELECT *.

Samuel Nde
la source
3

Résumer les réponses

Je peux voir de nombreuses réponses et façons différentes de le faire, mais il y a le hic là-dedans et c'est le objective.

Oui, l'objectif. Si vous voulez only knowles noms de colonnes que vous pouvez utiliser

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

Mais si vous voulez voir useces colonnes quelque part ou simplement les dire manipulate, les requêtes rapides ci-dessus ne seront d'aucune utilité. Vous devez utiliser

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

une autre façon de connaître certaines colonnes spécifiques où nous avons besoin de certaines colonnes similaires

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Shreekant
la source
1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
onavascuez
la source
Les autres réponses sont les mêmes.
Kiquenet
0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Simple et ne nécessite aucune table sys

Hawkzey
la source