如何识别表中的列顺序

And*_*ykh 10 sql-server sql-server-2008-r2

我需要按表定义顺序列出表中的列:

select * from syscolumns
where id = object_id('MyTable')
--order by colid
Run Code Online (Sandbox Code Playgroud)

通过检查syscolumns表,两列看起来相关:colidcolorder关于 syscolumns 的 MSDN 文章说:

colid    | smallint | Column or parameter ID.
colorder | smallint | Identified for informational purposes only. 
                    | Not supported. Future compatibility is not guaranteed.
Run Code Online (Sandbox Code Playgroud)

我试着跑

select * from syscolumns where colorder <> colid
Run Code Online (Sandbox Code Playgroud)

这没有产生任何行,这让我认为这些列在大多数情况下具有相同的值。

看起来最安全的选择是使用colid。但是我很想知道:这两列之间是否有区别,如果有,区别是什么?

MSDN 文章也没有确认,colid 反映了表定义的顺序。虽然可以合理地假设情况确实如此,但您能否告诉我,如果您确定确实如此,您是如何知道是这样的?

Tho*_*ger 14

您应该使用sys.columns目录视图。 syscolumns仅用于向后兼容。它实际上是一个不应在 SQL Server 2008 R2 中使用的 SQL Server 2000 系统表。

select *
from sys.columns
where object_id = object_id('MyTable')
order by column_id
Run Code Online (Sandbox Code Playgroud)

那应该返回您的列的顺序。但请注意,这些列 ID 可能不是连续的。


Ati*_*gur 10

我还想提供 INFORMATION_SCHEMA 视图。这些是 ANSI 标准,跨数据库工作,适用于支持它们的数据库。

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
ORDER BY ORDINAL_POSITION
Run Code Online (Sandbox Code Playgroud)


And*_*ton 5

如果您想要/需要按顺序排列列 ID,我使用了:

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
Run Code Online (Sandbox Code Playgroud)