【发布时间】:2010-12-04 06:48:55
【问题描述】:
我想使用 TSQL 确定表的主键(存储过程或系统表都可以)。 SQL Server(2005或2008)有这种机制吗?
【问题讨论】:
标签: sql sql-server tsql primary-key
我想使用 TSQL 确定表的主键(存储过程或系统表都可以)。 SQL Server(2005或2008)有这种机制吗?
【问题讨论】:
标签: sql sql-server tsql primary-key
这应该让你开始:
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'
【讨论】:
ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND tc.CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA 用于多个模式
怎么样
sp_pkeys 'TableName'
【讨论】:
declare @PrimaryKey table (TABLE_QUALIFIER nvarchar(100), TABLE_OWNER nvarchar(100), TABLE_NAME nvarchar(100), COLUMN_NAME nvarchar(100), KEY_SEQ int, PK_NAME nvarchar(100))再定义insert into @PrimaryKey exec sp_pkeys 'TABLE_NAME'
这是基于 SQL 2005 的系统表的一个(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 ccu.COLUMN_NAME, ccu.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu
ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME
WHERE tc.TABLE_CATALOG = 'Your_Catalog' -- replace with your catalog
AND tc.TABLE_SCHEMA = 'dbo' -- replace with your schema
AND tc.TABLE_NAME = 'Your_Table' -- replace with your table name
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
【讨论】:
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
【讨论】:
EXEC sp_Pkeys @tableName
【讨论】:
您最好使用INFORMATION_SCHEMA.KEY_COLUMN_USAGE,因为您可以访问重要的订购信息 (ORDINAL_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
【讨论】:
最简单的方法就是这个!
select object_id from sys.objects
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
【讨论】:
无法添加评论,没有足够的代表点数,但这是对那些说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
【讨论】:
如果您已经知道感兴趣的密钥的名称,请执行以下操作:
-- 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
【讨论】: