patternsqlMinor
Displaying the order of the columns of a table
Viewed 0 times
orderthecolumnsdisplayingtable
Problem
I created a table, and want to find the display the order of its columns.
Should I use the following query to display the info ordered by
Reading Microsoft SQL Server documentation, I am seeing the information below, so want to be sure:
Column name Data type Description
----------- --------- ----------------------------------------------
column_id: int ID of the column. Is unique within the object.
Column IDs might not be sequential.
Should I use the following query to display the info ordered by
column_id?select * from sys.columns c
where c.object_id = object_id('Customer')
order by column_id
create table dbo.Customer
(
CustomerId int primary key,
CustomerName varchar(255),
CustomerAddress varchar(255),
EnrollmentDate date
)Reading Microsoft SQL Server documentation, I am seeing the information below, so want to be sure:
Column name Data type Description
----------- --------- ----------------------------------------------
column_id: int ID of the column. Is unique within the object.
Column IDs might not be sequential.
Solution
column_id is a reasonable proxy for the column ordinal, since it is impossible to insert a column between two existing columns in SQL Server without dropping and recreating the table.As the documentation states,
column_id values may not be sequential if you drop a column from a table.You can also make use of the COLUMNPROPERTY() function to return the actual ordinal for each column.
Consider a quick example:
IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL
DROP TABLE dbo.t;
CREATE TABLE dbo.t
(
c1 int
, c2 int
, c3 int
, c4 int
);
ALTER TABLE dbo.t DROP COLUMN c1;
ALTER TABLE dbo.t ADD c5 int;
ALTER TABLE dbo.t ALTER COLUMN c2 char(3);
SELECT o.name
, c.name
, c.column_id
, ordinal = COLUMNPROPERTY(c.object_id, c.name, 'ordinal')
FROM sys.columns c
INNER JOIN sys.objects o ON c.object_id = o.object_id
WHERE o.name = N't'The output looks like:
╔══════╦══════╦═══════════╦═════════╗
║ name ║ name ║ column_id ║ ordinal ║
╠══════╬══════╬═══════════╬═════════╣
║ t ║ c2 ║ 2 ║ 1 ║
║ t ║ c3 ║ 3 ║ 2 ║
║ t ║ c4 ║ 4 ║ 3 ║
║ t ║ c5 ║ 5 ║ 4 ║
╚══════╩══════╩═══════════╩═════════╝
Code Snippets
IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL
DROP TABLE dbo.t;
CREATE TABLE dbo.t
(
c1 int
, c2 int
, c3 int
, c4 int
);
ALTER TABLE dbo.t DROP COLUMN c1;
ALTER TABLE dbo.t ADD c5 int;
ALTER TABLE dbo.t ALTER COLUMN c2 char(3);
SELECT o.name
, c.name
, c.column_id
, ordinal = COLUMNPROPERTY(c.object_id, c.name, 'ordinal')
FROM sys.columns c
INNER JOIN sys.objects o ON c.object_id = o.object_id
WHERE o.name = N't'Context
StackExchange Database Administrators Q#233179, answer score: 8
Revisions (0)
No revisions yet.