Comment renvoyez-vous les noms de colonne d'une table?

239

Comment retourner les noms de colonne d'une table à l'aide de SQL Server 2008? c'est-à-dire qu'une table contient ces colonnes: id, nom, adresse, pays et je veux les renvoyer sous forme de données.

Belliez
la source

Réponses:

401

Je ne sais pas s'il existe un moyen plus simple dans la version 2008.

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'
Gulzar Nazim
la source
7
Qu'est-ce que «YourSchemaName»?
Drewdin
12
'YourSchemaName' est le schéma de la table contre laquelle vous interrogez. Exemple: dbo.myTable, 'dbo' est le schéma auquel appartient 'myTable'. Les schémas facilitent l'attribution d'autorisations à un groupe au lieu de chaque table individuellement. Voir aussi cette question: stackoverflow.com/questions/1062075/…
jmosesman
3
N'oubliez pas la commande USE DatabaseName sinon vous pouvez rechercher dans la base de données principale ou différente de celle que vous souhaitez
Muflix
1
SELECT COLUMN_NAME, * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA = 'dbo'
Usman Younas
112

C'est le moyen le plus simple

exec sp_columns [tablename]
DiggDev
la source
2
C'est court et simple, devrait être la bonne réponse. J'imagine que cela n'existait pas lorsque la question a été posée à l'origine :)
DanteTheSmith
2
Si votre schéma n'est pas dbo, vous devez le passer comme paramètre supplémentaire. exec sp_columns [TableName], @table_owner = [schema]
Pradeep
32

Quelque chose comme ça?

sp_columns @table_name=your table name
Paul Lefebvre
la source
13

Une méthode consiste à interroger 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
la source
1
J'aime vraiment celle-ci. Je trouve la Objtypecolonne redondante, cependant :)
Joel
1
Ne serait-il pas préférable d'écrire complètement la jointure (sysobjects so inner join syscolumns sc on so.id = sc.id)? Cela semble être une réponse paresseuse au détriment des performances. Je peux me tromper ...
Losbear
1
@Losbear l'a changé PS: Pas paresseux, c'est juste du code d'il y a 8 ans. :) Autrefois (j'utilisais SQL Server à partir de la version 4.2), j'écrivais des requêtes SQL de cette façon. aucun problème de performances.
splattne
9

Cela semble un peu plus facile que les suggestions ci-dessus car il utilise la fonction OBJECT_ID () pour localiser l'id de la table. Toute colonne avec cet identifiant fait partie de la table.

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

J'utilise couramment une requête similaire pour voir si une colonne dont je sais qu'elle fait partie d'une version plus récente est présente. Il s'agit de la même requête avec l'ajout de {AND name = 'YOUR_COLUMN'} à la clause where.

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

essaye ça

select * from <tablename> where 1=2

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

Shanmugam Sudalaimuthu
la source
Intéressant, mais quelle est la logique derrière cela?
nilakantha singh deo
@nilakanthasinghdeo, la logique est qu'il retournera toujours zéro lignes avec WHERE 1=2et qu'il renverra toujours les métadonnées de la colonne. Si vous utilisez une interface de programmation telle que ODBC, alors cette information de colonne est accessible en tant que liste / tableau à partir de l'objet curseur dans le programme, ce que je cherchais. Cela peut ne pas avoir de sens dans un contexte SQL pur, mais c'est une approche succincte lors de la connexion à une base de données via Python / Java / C / etc.
Arthur Hebert
5

Ce qui suit ressemble à la première requête suggérée ci-dessus, mais vous devez parfois spécifier la base de données pour qu'elle fonctionne. Notez que la requête doit également fonctionner sans spécifier la 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
la source
4

j'utilise

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.
la source
3

Pourquoi ne pas simplement essayer ceci:

faites un clic droit sur le tableau -> Script Table As -> Create To -> New Query Editor Window?

La liste complète des colonnes est donnée dans le script. Copiez-le et utilisez les champs si nécessaire.

angieb1008
la source
3
L'auteur voulait probablement savoir comment obtenir les noms de colonne de la table par programme pour une utilisation dans une procédure stockée ou un autre script.
KLee1
1
La réponse indique "I want to return these as data"que, bien que votre réponse obtienne les valeurs, il est probable que l'OP souhaite les données lors de l'exécution.
StuperUser
2

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

Deepan Kanugula
la source
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
la source
2
Bienvenue chez SO! Mais il semble que cette question ait déjà obtenu une réponse satisfaisante il y a environ trois ans ... De plus, lorsque vous publiez du code, utilisez le {} pour le mettre en surbrillance. Jetez un œil à la FAQ, elle contient de bonnes informations pour commencer ici: stackoverflow.com/faq
Valentino Vranken
1

Je ne sais pas si la valeur syscolumns.colid est la même que la valeur 'ORDINAL_POSITION' renvoyée dans le cadre de sp_columns, mais dans ce qui suit, je l'utilise de cette façon - j'espère que je ne désinforme pas ...

Voici une légère variation sur certaines des autres réponses que j'ai trouvées - J'utilise cela parce que la `` position '' ou l'ordre de la colonne dans le tableau est important dans mon application - j'ai essentiellement besoin de savoir `` Comment s'appelle la colonne (n) ?

sp_columns retourne tout un tas de trucs superflus, et je suis plus pratique avec une sélection que les fonctions T-SQL, alors j'ai choisi cette voie:

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
la source
J'ai utilisé cette méthode pendant longtemps, mais on m'a déconseillé. En fait, j'ai touché le problème exact qu'on m'a dit que je pourrais ... il est plus probable que les nouvelles versions de MSSQL changeront la syntaxe. Par exemple, il s'agissait de sys.object et sys.columns dans les versions sur lesquelles j'ai utilisé cette technique pour la première fois. Soi-disant le schéma et les méthodes de procédure stockée sont plus de preuve contre cela ... pas sûr, mais jusqu'ici tout va bien.
RosieC
1

Bien que la réponse de @Gulzar Nazim soit excellente, il est probablement plus facile d'inclure le nom de la base de données dans la requête, ce qui pourrait être obtenu par le SQL suivant.

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

Vous pouvez utiliser le code ci-dessous pour imprimer tous les noms de colonne; Vous pouvez également modifier le code pour imprimer d'autres détails dans le format que vous souhaitez

    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

Production

column1
column2
column3
column4

Pour utiliser le même code pour imprimer la table et son nom de colonne en tant que classe C #, utilisez le code ci-dessous:

    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

Production:

 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
la source
0

J'utilise juste une requête comme Martin Smith l'a mentionné, juste un peu plus courte:

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

Étant donné que SysColumns est obsolète , utilisez 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.Typesdonnera user_type_id = IDle type. C'est unique dans la base de données. Pour les types de données du système: user_type_id = system_type_id.

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

SI vous travaillez avec postgresql, il est possible que plusieurs schémas aient une table du même nom dans ce cas, appliquez la requête ci-dessous

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