Comment identifier l'ordre des colonnes dans une table

9

J'ai besoin de lister les colonnes d'une table dans l'ordre de définition de la table:

select * from syscolumns
where id = object_id('MyTable')
--order by colid

En examinant les syscolumnstableaux, deux colonnes semblent pertinentes: colidet colorder. L'article MSDN sur syscolumns dit:

colid    | smallint | Column or parameter ID.
colorder | smallint | Identified for informational purposes only. 
                    | Not supported. Future compatibility is not guaranteed.

J'ai essayé de courir

select * from syscolumns where colorder <> colid

qui n'a donné aucune ligne, et cela me fait penser que ces colonnes ont la même valeur la plupart du temps.

Il semble que le pari le plus sûr consiste à utiliser colid. Cependant je serais curieux de savoir: y a-t-il une différence entre ces deux colonnes, et si c'est le cas, quelle est cette différence?

L'article MSDN ne confirme pas non plus que colid reflète l'ordre de la définition de la table. Bien qu'il soit raisonnable de supposer que c'est le cas, pourriez-vous s'il vous plaît me le faire savoir, si vous êtes sûr que c'est le cas, comment savez- vous que c'est le cas?

Andrew Savinykh
la source

Réponses:

11

Vous devez utiliser la sys.columnsvue catalogue. syscolumnsest inclus uniquement pour la compatibilité descendante. C'est vraiment une table système SQL Server 2000 qui ne devrait pas être utilisée dans SQL Server 2008 R2.

select *
from sys.columns
where object_id = object_id('MyTable')
order by column_id

Cela devrait renvoyer l'ordre de vos colonnes. Notez cependant que ces identifiants de colonne peuvent ne pas être séquentiels.

Thomas Stringer
la source
7

Je voudrais également proposer des vues INFORMATION_SCHEMA. Il s'agit de la norme ANSI et fonctionne sur plusieurs bases de données, pour les bases de données qui les prennent en charge.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
ORDER BY ORDINAL_POSITION
Atilla Ozgur
la source
3

Si vous voulez / avez besoin des ID de colonne en séquence, j'ai utilisé:

select 
    ROW_NUMBER() OVER (PARTITION BY OBJECT_NAME(object_id) ORDER BY Column_ID) as ColumnIDSeq,
    *
from sys.columns
where OBJECT_NAME(object_id) = 'MyTable'
order by column_id
Andrew Bickerton
la source