Jak rozpoznać kolejność kolumn w tabeli

9

Muszę wyświetlić kolumny z tabeli w kolejności definicji tabeli:

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

Analizując syscolumnstabele, dwie kolumny wydają się odpowiednie: colidi colorder. Artykuł MSDN na temat syscolumns mówi:

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

Próbowałem biec

select * from syscolumns where colorder <> colid

który nie dał żadnych wierszy, i to sprawia, że ​​myślę, że te kolumny przez większość czasu mają takie same wartości.

Wygląda na to, że najbezpieczniejszym zakładem jest użycie colid. Chciałbym jednak wiedzieć: czy istnieje różnica między tymi dwiema kolumnami, a jeśli tak, to na czym polega ta różnica?

Również artykuł MSDN nie potwierdza, że ​​colid odzwierciedla kolejność definicji tabeli. O ile uzasadnione jest założenie, że tak jest, proszę o informację, jeśli tak, to czy wiesz, że tak jest?

Andrew Savinykh
źródło

Odpowiedzi:

11

Powinieneś używać sys.columnswidoku katalogu. syscolumnsjest uwzględniony tylko dla kompatybilności wstecznej. To naprawdę tabela systemowa SQL Server 2000, której nie należy używać w SQL Server 2008 R2.

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

To powinno zwrócić kolejność twoich kolumn. Pamiętaj jednak, że te identyfikatory kolumn mogą nie być sekwencyjne.

Thomas Stringer
źródło
7

Chciałbym zaoferować również widoki INFORMACJE_SCHEMA. Są to ANSI Standard i działają między bazami danych, dla baz danych, które je obsługują.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
ORDER BY ORDINAL_POSITION
Atilla Ozgur
źródło
3

Jeśli chcesz / potrzebujesz columnIDs w sekwencji, użyłem:

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
źródło