Cara mengidentifikasi urutan kolom dalam sebuah tabel

9

Saya perlu membuat daftar kolom dari tabel dalam urutan definisi tabel:

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

Dengan memeriksa syscolumnstabel, dua kolom terlihat relevan: coliddan colorder. Artikel MSDN di syscolumns mengatakan:

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

Saya mencoba lari

select * from syscolumns where colorder <> colid

yang tidak menghasilkan baris, dan itu membuat saya berpikir bahwa kolom ini memiliki nilai yang sama hampir sepanjang waktu.

Itu terlihat bahwa taruhan paling aman adalah menggunakan colid. Namun saya ingin tahu: apakah ada perbedaan antara dua kolom ini, dan jika ada, apa perbedaan ini?

Juga artikel MSDN, tidak mengkonfirmasi, bahwa colid mencerminkan urutan definisi tabel. Meskipun ini masuk akal untuk berasumsi bahwa ini adalah masalahnya, dapatkah Anda memberi tahu saya, jika Anda yakin itu masalahnya, bagaimana Anda tahu bahwa ini masalahnya?

Andrew Savinykh
sumber

Jawaban:

11

Anda harus menggunakan tampilan sys.columnskatalog. syscolumnshanya disertakan untuk kompatibilitas mundur. Ini benar-benar tabel sistem SQL Server 2000 yang tidak boleh digunakan dalam SQL Server 2008 R2.

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

Itu akan mengembalikan urutan kolom Anda. Namun, perhatikan id kolom ini mungkin tidak berurutan.

Thomas Stringer
sumber
7

Saya juga ingin menawarkan tampilan INFORMATION_SCHEMA. Ini adalah Standar ANSI dan berfungsi lintas basis data, untuk basis data yang mendukungnya.

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

Jika Anda ingin / membutuhkan kolomID secara berurutan, saya telah menggunakan:

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
sumber