确定一个表';s主键使用TSQL

确定一个表';s主键使用TSQL,sql,sql-server,tsql,primary-key,Sql,Sql Server,Tsql,Primary Key,我想使用TSQL(存储过程或系统表可以)确定表的主键。SQL Server(2005或2008)中是否有这样的机制?这应该让您开始: SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name WHERE

我想使用TSQL(存储过程或系统表可以)确定表的主键。SQL Server(2005或2008)中是否有这样的机制?

这应该让您开始:

SELECT 
    *
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
    JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
        ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE 
    tc.TABLE_NAME = 'TableName' AND 
    tc.CONSTRAINT_TYPE = 'Primary Key'
怎么样

sp_pkeys 'TableName'

这里有一个基于SQL2005中的系统表(99%确定它在2008年可以工作)。这将列出所有用户定义表的所有PK,以及可以删除的所有列和一些额外的绒毛。添加参数以一次选择一个表

SELECT
   schema_name(ta.schema_id)  SchemaName
  ,ta.name  TableName
  ,ind.name
  ,indcol.key_ordinal Ord
  ,col.name  ColumnName
  ,ind.type_desc
  ,ind.fill_factor
 from sys.tables ta
  inner join sys.indexes ind
   on ind.object_id = ta.object_id
  inner join sys.index_columns indcol
   on indcol.object_id = ta.object_id
    and indcol.index_id = ind.index_id
  inner join sys.columns col
   on col.object_id = ta.object_id
    and col.column_id = indcol.column_id
 where ind.is_primary_key = 1
 order by
   ta.name
  ,indcol.key_ordinal

最简单的方法就是这样

select object_id from sys.objects 
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'

最好使用
INFORMATION\u SCHEMA.KEY\u COLUMN\u用法
,因为您可以访问键排序信息(
ORDINAL\u POSITION
),了解这些信息非常重要

SELECT 
    kcu.*
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
    INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
        ON  tc.TABLE_NAME = kcu.TABLE_NAME AND 
            tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
ORDER BY 
    tc.TABLE_NAME,
    tc.CONSTRAINT_NAME,
    kcu.ORDINAL_POSITION

如果您已经知道您感兴趣的密钥的名称,请执行以下操作:

-- Assuming you have schema "Example" and the primary key name is "PK_Item"
-- Notice that name of table is irrelevant here but is "Foobar" here
IF (OBJECT_ID('Example.PK_ITEM') IS NULL)
BEGIN
    ALTER TABLE [Example].Foobar ADD CONSTRAINT
    PK_Item PRIMARY KEY ...
END

无法添加评论,没有足够的代表点,但这是对那些说
sp_Pkeys
不可用的人的回应。不必是回答的另一条评论中提到的函数

DECLARE @tbl TABLE
(
  Table_Qualifier varchar(30), 
  Table_Owner varchar(30), 
  Table_Name varchar(50), 
  Column_Name varchar(30), 
  Key_Seq int,
  PK_Name varchar(50)
)

insert into @tbl EXEC sp_Pkeys 'tablename'

select * from @tbl

这比公认的答案要好得多,因为它提供了表名。它的列和主键的大小写正确,因此可以在区分大小写的服务器上工作!恒星的我从中看到了比通过信息的表连接更好的性能。如果它是一个表值函数,您可以从中选择,它会更方便。因为它不是一个函数,所以不能对结果做任何事情。如果您需要一个表,您可以将存储过程的结果插入到表中。首先定义表
declare@PrimaryKey表(表\u限定符nvarchar(100)、表\u所有者nvarchar(100)、表\u名称nvarchar(100)、列\u名称nvarchar(100)、键\u SEQ int、PK\u名称nvarchar(100))
然后
插入@PrimaryKey exec sp\u pkeys'表\u NAME'
此代码不返回包含主键的列,尝试复合主键。如果OP尝试查找表的主键,为什么依赖于了解表的主键的答案会有用?我猜我将“确定”解释为“检测是否存在”
关于tc.CONSTRAINT\u NAME=ccu.CONSTRAINT\u NAME和tc.CONSTRAINT\u SCHEMA=ccu.CONSTRAINT\u SCHEMA
用于多个架构
SELECT 
    kcu.*
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
    INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
        ON  tc.TABLE_NAME = kcu.TABLE_NAME AND 
            tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
ORDER BY 
    tc.TABLE_NAME,
    tc.CONSTRAINT_NAME,
    kcu.ORDINAL_POSITION
-- Assuming you have schema "Example" and the primary key name is "PK_Item"
-- Notice that name of table is irrelevant here but is "Foobar" here
IF (OBJECT_ID('Example.PK_ITEM') IS NULL)
BEGIN
    ALTER TABLE [Example].Foobar ADD CONSTRAINT
    PK_Item PRIMARY KEY ...
END
DECLARE @tbl TABLE
(
  Table_Qualifier varchar(30), 
  Table_Owner varchar(30), 
  Table_Name varchar(50), 
  Column_Name varchar(30), 
  Key_Seq int,
  PK_Name varchar(50)
)

insert into @tbl EXEC sp_Pkeys 'tablename'

select * from @tbl