Me gustaría para determinar la clave primaria de una tabla a través de TSQL (procedimiento almacenado o una tabla del sistema está muy bien). Existe un mecanismo en SQL Server 2005 o 2008)?

InformationsquelleAutor rein | 2009-10-06

9 Comentarios

  1. 70

    Esto debe comenzar:

    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'
  2. 41

    ¿

    sp_pkeys 'TableName'
    • estelar! Estoy viendo mucho mejor rendimiento de este que de las combinaciones de la tabla a través de information_schema
    • Esto sería mucho más práctico si se tratara de una función con valores de tabla que puede seleccionar de
  3. 21

    Aquí está uno basado en el sistema de tablas de SQL 2005 (99% seguro de que iba a trabajar en 2008). Esto mostrará una lista de todos los PKs para todas las tablas definidas por el usuario, con todas las columnas y algunos otros artilugios que podría ser eliminado. Agregar parámetros a 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
    • Sí, funciona en SQL 2008 así.
  4. 18
    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'
    • Este es camino mejor que el aceptado respuesta, ya que proporciona el nombre de la tabla.
    • También es mucho mejor, ya que tiene la correcta cubierta en las columnas de CLAVE PRINCIPAL por lo que funciona en un caso sensible servidor!
  5. 2

    Es mejor que use INFORMATION_SCHEMA.KEY_COLUMN_USAGE como usted puede tener acceso a la clave de pedido de información (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
  6. 1

    La forma más sencilla es esta!

    select object_id from sys.objects 
    where parent_object_id = OBJECT_ID(N'FACounty')
    and [type] = N'PK'
    • Este código no devuelve las columnas que componen la clave primaria, pruebe en claves primarias compuestas.
  7. 0

    Si ya sabes el nombre de la clave que usted está interesado en, siguientes obras:

    -- 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
    • Si el OP está tratando de encontrar la clave principal de una tabla, por qué una respuesta que se basa en el conocimiento de la clave primaria de la tabla a ser útil?
    • Supongo que interpreta el «determinar» como «detectar si existe»

Dejar respuesta

Please enter your comment!
Please enter your name here