ฉันต้องการกำหนดคีย์หลักของตารางโดยใช้ TSQL (ขั้นตอนการจัดเก็บหรือตารางระบบก็ใช้ได้) มีกลไกดังกล่าวใน SQL Server (2005 หรือ 2008) หรือไม่
กำหนดคีย์หลักของตารางโดยใช้ TSQL
คำตอบ (8)
สิ่งนี้ควรช่วยให้คุณเริ่มต้นได้:
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'
person
Stuart Ainsworth
schedule
06.10.2009
ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND tc.CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA
สำหรับหลายสคีมา
- person Bohdan; 11.01.2021
เกี่ยวกับ
sp_pkeys 'TableName'
person
Jason Punyon
schedule
06.10.2009
ตัวเอก! ฉันเห็นประสิทธิภาพที่ดีขึ้นมากจากสิ่งนี้มากกว่าจากการรวมตารางผ่าน information_schema
- person Mike M; 28.05.2015
นี่จะสะดวกกว่ามากหากเป็นฟังก์ชันที่มีค่าของตารางที่คุณสามารถเลือกได้
- person xr280xr; 08.08.2017
ไม่สามารถทำอะไรกับผลลัพธ์ได้เพราะว่ามันไม่ใช่ฟังก์ชัน
- person Peter Moore; 02.12.2019
หากคุณต้องการตาราง คุณสามารถแทรกผลลัพธ์ของกระบวนงานที่เก็บไว้ลงในตารางได้ ขั้นแรกให้กำหนดตาราง
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'
- person Alexander Higgins; 02.12.2020
นี่คือตารางระบบจาก 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
person
Philip Kelley
schedule
06.10.2009
คุณควรใช้ 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
person
sqlconsumer.net
schedule
12.10.2015
วิธีที่ง่ายที่สุดคือสิ่งนี้!
select object_id from sys.objects
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
person
JT Turner
schedule
10.12.2014
รหัสนี้ไม่ส่งคืนคอลัมน์ที่มีคีย์หลัก โปรดลองใช้คีย์หลักแบบผสม
- person veljasije; 11.11.2015
ไม่สามารถเพิ่มความคิดเห็นได้ คะแนนตัวแทนไม่เพียงพอ แต่นี่เป็นการตอบสนองต่อผู้ที่บอกว่า 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
person
S Wagar
schedule
25.07.2020
หากคุณทราบชื่อคีย์ที่คุณสนใจแล้ว ให้ดำเนินการดังนี้:
-- 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
person
Pasi Savolainen
schedule
18.04.2016
หาก OP พยายามค้นหาคีย์หลักของตาราง เหตุใดคำตอบที่ต้องอาศัยการรู้คีย์หลักของตารางจึงมีประโยชน์
- person GreySage; 16.07.2019
ฉันเดาว่าฉันตีความการตรวจสอบว่าตรวจพบว่ามีอยู่หรือไม่
- person Pasi Savolainen; 17.07.2019
person
schedule
นี่เป็น ทาง ดีกว่าคำตอบที่ยอมรับ เนื่องจากจะให้ชื่อตาราง
- person Uwe Keim; 16.10.2013
นอกจากนี้ยังดีกว่ามากเนื่องจากมีตัวพิมพ์ที่ถูกต้องบนคอลัมน์และคีย์หลัก ดังนั้นจึงทำงานบนเซิร์ฟเวอร์ที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่!
- person Ed Elliott; 12.11.2014