繁体   English   中英

获取表的主键列

[英]Get Primary Key Column of a Table

我想确保这是获取给定表名称的pk名称,架构,表名称和列名称的正确方法

SELECT i.name AS IndexName,
       (SELECT SCHEMA_NAME([schema_id]) FROM sys.[tables] WHERE [object_id] = ic.OBJECT_ID) SchemaName,
       OBJECT_NAME(ic.OBJECT_ID) AS TableName,
       COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
  FROM sys.indexes AS i
 INNER JOIN sys.index_columns AS ic
    ON i.OBJECT_ID = ic.OBJECT_ID
   AND i.index_id = ic.index_id
 WHERE i.is_primary_key = 1
   AND OBJECT_NAME(ic.OBJECT_ID) = 'MyTable'

我相信这是有效的

SELECT i.name AS IndexName,
       SCHEMA_NAME([schema_id]) SchemaName,
       OBJECT_NAME(ic.OBJECT_ID) AS TableName,
       COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName, 
       ic.key_ordinal
  FROM sys.indexes AS i
 INNER JOIN sys.index_columns AS ic
    ON i.OBJECT_ID = ic.OBJECT_ID
   AND i.index_id = ic.index_id
 INNER JOIN sys.[tables] st
    ON st.[object_id] = ic.OBJECT_ID
 WHERE i.is_primary_key = 1
   AND SCHEMA_NAME([schema_id]) = 'auth'
   AND OBJECT_NAME(ic.OBJECT_ID) = 'Profile'

有很多方法可以做到这一点,没有一个“正确的方法”。 这是可行的,但有些附带的盒子会让您不知所措。 一些小的调整:

SELECT
  schema_name(t.schema_id) AS SchemaName
 ,t.name AS TableName
 ,i.name AS IndexName
 ,co.name AS ColumnName
 ,ic.key_ordinal AS ColumnOrder  --  [2]
  FROM sys.tables AS t
 INNER JOIN  sys.indexes AS i
    ON i.OBJECT_ID = t.OBJECT_ID
 INNER JOIN sys.index_columns AS ic
    ON i.OBJECT_ID = ic.OBJECT_ID
   AND i.index_id = ic.index_id
 INNER JOIN sys.columns AS co
    ON co.column_id = ic.index_column_id
   AND co.object_id = t.object_id
 WHERE i.is_primary_key = 1
   AND t.name = 'MyTable'
   AND schema_name(t.schema_id) = 'dbo'  --  [1]
 ORDER BY ic.key_ordinal  --  [2]

[1]可让您指定要搜索的架构(仅在定义了多个dbo时才重要)

[2]涵盖复合(多列)索引,并显示其顺序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM