Определить первичный ключ таблицы с помощью TSQL - PullRequest
48 голосов
/ 06 октября 2009

Я бы хотел определить первичный ключ таблицы, используя TSQL (хранимая процедура или системная таблица в порядке). Есть ли такой механизм в SQL Server (2005 или 2008)?

Ответы [ 9 ]

70 голосов
/ 06 октября 2009

Это должно помочь вам начать:

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'
40 голосов
/ 06 октября 2009

Как насчет

sp_pkeys 'TableName'
21 голосов
/ 06 октября 2009

Вот пример, основанный на системных таблицах из 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
18 голосов
/ 06 октября 2009
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'
4 голосов
/ 06 октября 2009
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
4 голосов
/ 06 октября 2009
EXEC sp_Pkeys @tableName
2 голосов
/ 12 октября 2015

Вам лучше использовать 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
1 голос
/ 10 декабря 2014

Самый простой способ это!

select object_id from sys.objects 
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
0 голосов
/ 18 апреля 2016

Если вы уже знаете название интересующего вас ключа, выполните следующие работы:

-- 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
...