确定一个表';s主键使用TSQL
我想使用TSQL(存储过程或系统表可以)确定表的主键。SQL Server(2005或2008)中是否有这样的机制?这应该让您开始:确定一个表';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
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