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


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:


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.


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

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


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.


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'

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;

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

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

TABLE_NAME est ta table


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

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

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'

10

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

desc <TABLE NAME> ;

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

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

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


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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.