Je voudrais déterminer la clé primaire d'une table en utilisant TSQL (procédure stockée ou table système, c'est bien). Existe-t-il un tel mécanisme dans SQL Server (2005 ou 2008)?
Cela devrait vous aider à démarrer:
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'
Que diriez-vous
sp_pkeys 'TableName'
En voici une qui repose sur les tables système de SQL 2005 (99% d’assurance que cela fonctionnerait en 2008). Ceci listera toutes les PK de toutes les tables définies par l'utilisateur, avec toutes les colonnes et quelques données supplémentaires qui pourraient être supprimées. Ajoutez des paramètres pour choisir une table à la fois.
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 sp_Pkeys @tableName
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
Le moyen le plus simple est-ce!
select object_id from sys.objects
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
Vous feriez mieux d'utiliser INFORMATION_SCHEMA.KEY_COLUMN_USAGE car vous pouvez accéder aux informations de commande de clé (ORDINAL_POSITION), qu'il est très important de connaître.
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
Si vous connaissez déjà le nom de la clé qui vous intéresse, procédez comme suit:
-- 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