Como identificar a ordem das colunas em uma tabela

9

Preciso listar colunas de uma tabela na ordem de definição de tabela:

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

Examinando as syscolumnstabelas, duas colunas parecem relevantes: colide colorder. O artigo do MSDN sobre syscolumns diz:

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

Eu tentei correr

select * from syscolumns where colorder <> colid

que não produziu linhas, e isso me faz pensar que essas colunas têm os mesmos valores na maioria das vezes.

Parece que a aposta mais segura é usar colid. No entanto, eu ficaria curioso para saber: existe uma diferença entre essas duas colunas e, se houver, qual é essa diferença?

O artigo do MSDN também não confirma que colid reflete a ordem da definição da tabela. Embora seja razoável supor que esse seja o caso, você poderia me avisar, se tiver certeza de que é esse o caso, como sabe disso?

Andrew Savinykh
fonte

Respostas:

11

Você deve estar usando a sys.columnsexibição do catálogo. syscolumnsestá incluído apenas para compatibilidade com versões anteriores. É realmente uma tabela de sistema do SQL Server 2000 que não deve ser usada no SQL Server 2008 R2.

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

Isso deve retornar a ordem das suas colunas. Observe, porém, que esses IDs de coluna podem não ser seqüenciais.

Thomas Stringer
fonte
7

Gostaria de oferecer também visualizações do INFORMAÇÕES_SCHEMA. Estes são os padrões ANSI e funcionam entre bancos de dados, para bancos de dados que os suportam.

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

Se você deseja / precisa dos columnIDs em sequência, usei:

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
fonte