Чтобы узнать, что является первичным ключом (при условии, что ваша таблица dbo.T1):
select si.name as name,
(case when (si.status & 16) > 0 then 1 else 0 end) as isclust,
si.keycnt as keycnt,
si.indid as indid
from sysindexes si
left join sysobjects so on so.id = si.id
where si.indid > 0
and si.indid < 255
and so.xtype <> 'S'
and so.id = OBJECT_ID('dbo.T1')
and (si.status & 2048) > 0
Это даст вам что-то вроде:
name isclust keycnt indid
---------------------------------------------------------------
PK_T1 1 2 1
Здесь у вас есть имя первичного ключа (PK_T1), независимо от того, кластеризовано оно или нет, количество полей в нем (2) и идентификатор индекса (вам понадобится позже).
Далее выполните следующее:
select INDEX_COL('dbo.T1', 1, 1) --returns Field1
select INDEX_COL('dbo.T1', 1, 2) --returns Field2
Это даст вам имена двух полей из индекса. Первый параметр - это имя таблицы, второй - идентификатор индекса, полученный ранее, а третий - от 1 до keycnt (возвращается на предыдущем шаге).
Имея эту информацию, вы сможете восстановить первичный ключ следующим образом:
ALTER TABLE dbo.T1 ADD CONSTRAINT PK_T1 PRIMARY KEY CLUSTERED (Field1, Field2)
Обновление: это может быть не так точно, как анализ результатов sp_help, упомянутых ранее (вы упустите порядок сортировки и файловая группа), но проще программно.