Как определить порядок столбцов в таблице

9

Мне нужно перечислить столбцы из таблицы в порядке определения таблицы:

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

Изучая syscolumnsтаблицы, две колонки выглядят актуально: colidи colorder. В статье MSDN о syscolumns говорится:

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

Я пытался бежать

select * from syscolumns where colorder <> colid

что не дало строк, и это заставляет меня думать, что эти столбцы большую часть времени имеют одинаковые значения.

Похоже, что самая безопасная ставка - использовать Colid. Однако мне было бы любопытно узнать: есть ли разница между этими двумя столбцами, и если есть, то какова эта разница?

Также статья MSDN, не подтверждает, что colid отражает порядок определения таблицы. Хотя разумно предположить, что это так, не могли бы вы сообщить мне, если вы уверены, что это так, но откуда вы знаете, что это так?

Андрей Савиных
источник

Ответы:

11

Вы должны использовать представление sys.columnsкаталога. syscolumnsвключен только для обратной совместимости. Это действительно системная таблица SQL Server 2000, которая не должна использоваться в SQL Server 2008 R2.

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

Это должно вернуть порядок ваших столбцов. Обратите внимание, что идентификаторы этих столбцов могут быть не последовательными.

Томас Стрингер
источник
7

Я хотел бы предложить также INFORMATION_SCHEMA просмотров. Это стандарт ANSI и работает кросс-базы данных, для баз данных, которые их поддерживают.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
ORDER BY ORDINAL_POSITION
Атилла Озгур
источник
3

Если вы хотите / хотите колонки в последовательности, я использовал:

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
Эндрю Бикертон
источник