Come identificare l'ordine delle colonne in una tabella


9

Devo elencare le colonne da una tabella nell'ordine di definizione della tabella:

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

Esaminando le syscolumnstabelle, due colonne sembrano rilevanti: colide colorder. L'articolo di MSDN su syscolumns dice:

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

Ho provato a correre

select * from syscolumns where colorder <> colid

che non ha prodotto righe e che mi fa pensare che queste colonne abbiano gli stessi valori il più delle volte.

Sembra che la scommessa più sicura sia usare il colid. Tuttavia sarei curioso di sapere: c'è una differenza tra queste due colonne, e se c'è, qual è questa differenza?

Anche l'articolo MSDN, non conferma, che colid riflette l'ordine della definizione della tabella. Mentre è ragionevole supporre che sia così, potresti per favore farmi sapere, se sei sicuro che sia così, come sai che è così?

Risposte:


11

Dovresti usare la sys.columnsvista del catalogo. syscolumnsè incluso solo per compatibilità con le versioni precedenti. È davvero una tabella di sistema di SQL Server 2000 che non dovrebbe essere utilizzata in SQL Server 2008 R2.

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

Questo dovrebbe restituire l'ordine delle tue colonne. Nota, tuttavia, questi ID colonna potrebbero non essere sequenziali.


7

Vorrei offrire anche visualizzazioni INFORMATION_SCHEMA. Questi sono standard ANSI e funzionano su più database, per database che li supportano.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
ORDER BY ORDINAL_POSITION

3

Se vuoi / hai bisogno degli ID colonna in sequenza, ho usato:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.