Ich möchte den Primärschlüssel einer Tabelle mithilfe von TSQL (gespeicherte Prozedur oder Systemtabelle ist in Ordnung) ermitteln. Gibt es einen solchen Mechanismus in SQL Server (2005 oder 2008)?Bestimmen Sie den Primärschlüssel einer Tabelle mit TSQL
Antwort
Dies sollte Ihnen den Einstieg:
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE tc.CONSTRAINT_TYPE = 'Primary Key'
Wie wäre es
sp_pkeys 'TableName'
EXEC sp_Pkeys @tableName
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
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'
auswählen könnten Das ist _way_ besser als die angenommene Antwort, da es den Tabellennamen bereitstellt . –
Es ist auch viel besser, da es das richtige Gehäuse auf den Spalten und PRIMARY KEY hat, so dass es auf einem case sensitive Server funktioniert! –
ein hier basierend auf Systemtabellen von SQL 2005 (99% sicher, dass es‘ d Arbeit im Jahr 2008). Dies listet alle PKs für alle benutzerdefinierten Tabellen auf, mit allen Spalten und einigen zusätzlichen Flusen, die entfernt werden könnten. Fügen Sie Parameter hinzu, um eine Tabelle gleichzeitig auszuwählen.
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
Ja, es funktioniert auch in SQL 2008. –
Der einfachste Weg ist dies!
select object_id from sys.objects
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
Dieser Code gibt keine Spalten zurück, die aus einem Primärschlüssel bestehen, versuchen Sie es mit zusammengesetzten Primärschlüsseln. – veljasije
Du bist besser dran mit INFORMATION_SCHEMA.KEY_COLUMN_USAGE wie Sie die Taste Bestellinformationen zugreifen können (ORDINAL_POSITION), die sehr wichtig ist, zu wissen.
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
Wenn Sie wissen bereits den Namen des Schlüssels Sie interessiert sind, folgende Arbeiten:
-- 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
stellar! Ich sehe viel bessere Leistung von diesem als von der Tabelle Joins durch information_schema –
Dies wäre viel handlicher, wenn es eine Tabellenwertfunktion wäre, die Sie aus – xr280xr