So identifizieren Sie die Spaltenreihenfolge in einer Tabelle

9

Ich muss Spalten aus einer Tabelle in der Reihenfolge der Tabellendefinition auflisten:

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

Bei der Untersuchung von syscolumnsTabellen sehen zwei Spalten relevant aus: colidund colorder. Der MSDN-Artikel zu syscolumns lautet:

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

Ich habe versucht zu rennen

select * from syscolumns where colorder <> colid

Das ergab keine Zeilen, und das lässt mich denken, dass diese Spalten die meiste Zeit die gleichen Werte haben.

Es sieht so aus, als ob die sicherste Wette die Verwendung von Colid ist. Ich wäre jedoch neugierig zu wissen: Gibt es einen Unterschied zwischen diesen beiden Spalten, und wenn ja, was ist dieser Unterschied?

Auch der MSDN-Artikel bestätigt nicht, dass colid die Reihenfolge der Tabellendefinition widerspiegelt. Obwohl dies vernünftig ist anzunehmen, dass dies der Fall ist, können Sie mich bitte informieren, wenn Sie sicher sind , dass dies der Fall ist, woher wissen Sie, dass dies der Fall ist?

Andrew Savinykh
quelle

Antworten:

11

Sie sollten die sys.columnsKatalogansicht verwenden. syscolumnsist nur aus Gründen der Abwärtskompatibilität enthalten. Es ist wirklich eine SQL Server 2000-Systemtabelle, die in SQL Server 2008 R2 nicht verwendet werden sollte.

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

Das sollte die Reihenfolge Ihrer Spalten zurückgeben. Beachten Sie jedoch, dass diese Spalten-IDs möglicherweise nicht sequentiell sind.

Thomas Stringer
quelle
7

Ich möchte auch INFORMATION_SCHEMA-Ansichten anbieten. Dies sind ANSI-Standards und arbeiten datenbankübergreifend für Datenbanken, die sie unterstützen.

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

Wenn Sie die Spalten-IDs nacheinander möchten / benötigen, habe ich Folgendes verwendet:

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
quelle