2009-10-06 23 views

Respuesta

61

Esto debería empezar:

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' 
32

¿Qué tal

sp_pkeys 'TableName' 
+0

estelar! Veo un rendimiento mucho mejor a partir de esto que desde la tabla se une a information_schema –

+0

Esto sería mucho más útil si fuera una función de tabla con valores que pudiera seleccionar desde – xr280xr

3
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName' 
17
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' 
+1

Esto es _way_ mejor que la respuesta aceptada, ya que proporciona el nombre de la tabla . –

+0

¡También es mucho mejor ya que tiene la carcasa correcta en las columnas y PRIMARY KEY para que funcione en un servidor sensible a mayúsculas y minúsculas! –

15

Aquí hay uno basado en las tablas del sistema de SQL Server 2005 (99% seguro de que' d trabajo en 2008). Esto mostrará una lista de todas las PK para todas las tablas definidas por el usuario, con todas las columnas y algunas pelusas adicionales que podrían eliminarse. Agregue parámetros para elegir una tabla a la vez.

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 
+1

Sí, funciona en SQL 2008 también. –

1

¡La manera más simple es esta!

select object_id from sys.objects 
where parent_object_id = OBJECT_ID(N'FACounty') 
and [type] = N'PK' 
+0

Este código no devuelve las columnas que constan de la clave principal, pruebe las claves primarias compuestas. – veljasije

0

Es mejor utilizar INFORMATION_SCHEMA.KEY_COLUMN_USAGE como se puede acceder a la información de pedido de claves (ORDINAL_POSITION) que es muy importante saber.

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 
0

Si ya conoce el nombre de la clave que le interesa, las obras siguientes:

-- 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 
Cuestiones relacionadas