2017-01-09 20 views
0

我正在尝试编写SQL查询以获取表的主键的完整规范。我可以编写一个查询来获取涉及的列,但我无法查询列的排序信息。例如表中定义为:Sql Server - 通过SQL查询获取包括列排序顺序的表的完整主键

CREATE TABLE [dbo].[MyPrimaryKeyTable]([MyKeyColumn] [int] NOT NULL, [SecondKeyColumn] [int] NOT NULL, [ThirdCol] [varchar](50) NOT NULL, [ForthCol] [varchar](10) NOT NULL) 
GO 

ALTER TABLE [dbo].[MyPrimaryKeyTable] ADD CONSTRAINT [PK_MyPrimaryKey] PRIMARY KEY CLUSTERED ([MyKeyColumn] ASC, [SecondKeyColumn] DESC, [ThirdCol] DESC) 
GO 

如果您使用查询:

SELECT * 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'MyPrimaryKeyTable' 

然后我返回一组结果显示表名和三列组成的主键(MyKeyColumn,SecondKeyColumn和ThirdCol),但没有信息可以说MyKeyColumn是按升序排序的,而其他两列是按键降序排序的。如何查询主键的列排序信息?

回答

1

就像这样 - 您可以将OBJECT_NAME(o.parent_object_id)='tablename'添加到单个PK的位置。通过少量调整,它也可以为您提供所有索引的数据。

SELECT OBJECT_SCHEMA_NAME(o.parent_object_id) AS [Schema], OBJECT_NAME(o.parent_object_id) AS [Table], o.name AS PrimaryKey, ic.index_id, ic.key_ordinal, c.name AS ColumnName, t.name AS DataType, ic.is_descending_key 
from sys.objects o 
inner join sys.indexes i on i.object_id = o.parent_object_id and i.is_primary_key = 1 
inner join sys.index_columns ic on ic.object_id = i.object_id and ic.index_id = i.index_id 
inner join sys.columns c on c.object_id = o.parent_object_id and c.column_id = ic.column_id 
inner join sys.types t ON t.user_type_id = c.user_type_id 
where o.type = 'PK' 
ORDER BY OBJECT_SCHEMA_NAME(o.parent_object_id), OBJECT_NAME(o.parent_object_id), ic.key_ordinal 

在更一般的说明中,使用MS的DMV通常会显示比INFORMATION_SCHEMA视图更多的信息,例如,用户数据类型&其他SQL Server特有的功能。

+0

谢谢,这正是我正在寻找 –

+0

@KevinHolditch没问题的队友 –