Cómo identificar el orden de las columnas en una tabla

9

Necesito enumerar las columnas de una tabla en el orden de definición de la tabla:

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

Al examinar las syscolumnstablas, dos columnas parecen relevantes: colidy colorder. El artículo de MSDN sobre syscolumns dice:

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

Traté de correr

select * from syscolumns where colorder <> colid

que no produjo filas, y eso me hace pensar que estas columnas tienen los mismos valores la mayor parte del tiempo.

Parece que la apuesta más segura es usar colid. Sin embargo, me gustaría saber: ¿hay alguna diferencia entre estas dos columnas y, si la hay, cuál es esta diferencia?

Además, el artículo de MSDN no confirma que colid refleja el orden de la definición de la tabla. Si bien es razonable suponer que este es el caso, ¿podría informarme, si está seguro de que es así, cómo sabe que es así?

Andrew Savinykh
fuente

Respuestas:

11

Debería estar usando la sys.columnsvista de catálogo. syscolumnsse incluye solo para compatibilidad con versiones anteriores. Realmente es una tabla del sistema SQL Server 2000 que no debería usarse en SQL Server 2008 R2.

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

Eso debería devolver el orden de sus columnas. Sin embargo, tenga en cuenta que estos ID de columna pueden no ser secuenciales.

Thomas Stringer
fuente
7

Me gustaría ofrecer también vistas de INFORMATION_SCHEMA. Estos son el estándar ANSI y funcionan entre bases de datos, para bases de datos que los admiten.

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

Si desea / necesita los ID de columna en secuencia, he utilizado:

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
fuente