2009-09-03 5 views
5

Кто-нибудь знает, как я могу видеть, какие основные ключи & в таблице?SQL Server 2008: узнать первичный/внешний ключ в таблице?

EDIT: Спасибо за все ответы. Я искал SQL-запрос для этого. Прямо сейчас я играю с написанием инструмента, который может перечислить мне все таблицы БД и показать столбцы. Я также хотел бы отобразить, какие из ключей являются первичными ключами.

Это, как я зачитала таблицы каталога:

const string sqlSelectTable = "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " + 
             "FROM INFORMATION_SCHEMA.TABLES " + 
             "WHERE TABLE_TYPE = 'BASE TABLE' " + 
             "ORDER BY TABLE_TYPE,TABLE_NAME"; 

И это, как я получаю Infos о колонке:

const string sqlSelectTable = 
      "SELECT  COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH " + 
      "FROM   INFORMATION_SCHEMA.COLUMNS " + 
      "WHERE  (TABLE_NAME = @TABLE_NAME) " + 
      "ORDER BY ORDINAL_POSITION"; 

бы я должен создать Inner-Join так какой из столбцов является основным ключом?

Приветствия

ответ

11

Для первичного ключа каждой таблицы, вы можете использовать этот запрос:

SELECT 
    kc.name, 
    c.NAME 
FROM 
    sys.key_constraints kc 
INNER JOIN 
    sys.index_columns ic ON kc.parent_object_id = ic.object_id 
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
WHERE 
    kc.type = 'PK' 

и для внешнего ключа, я считаю, что этот запрос должен предоставить вам необходимую информацию:

SELECT 
    OBJECT_NAME(parent_object_id) 'Parent table', 
    c.NAME 'Parent column name', 
    OBJECT_NAME(referenced_object_id) 'Referenced table', 
    cref.NAME 'Referenced column name' 
FROM 
    sys.foreign_key_columns fkc 
INNER JOIN 
    sys.columns c 
     ON fkc.parent_column_id = c.column_id 
      AND fkc.parent_object_id = c.object_id 
INNER JOIN 
    sys.columns cref 
     ON fkc.referenced_column_id = cref.column_id 
      AND fkc.referenced_object_id = cref.object_id 

Марк

+0

Нет, не работает. Он возвращает все индексы, которые вы создали. – Craig

+0

@Craig: запрос # 1 ** только ** возвращает первичные ключи - запрос # 2 возвращает ** только ** внешние ключи - или что вы получаете? –

3

В Management Studio разверните таблицу, а затем разверните элемент Столбцы. Первичный ключ (ы) имеет значок рядом с ним.

Чтобы просмотреть внешние ключи, разверните элемент «Ограничения».

1

Вы можете начать с:

SELECT 
    Table_Name as [TableName], 
    Column_Name as [ColumnName], 
    Constraint_Name as [Constraint], 
    Table_Schema as [Schema] 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
ORDER BY 
    [TableName], 
    [ColumnName] 

(вы можете отфильтровать затем TABLENAME)

1
SELECT 
OBJECT_NAME(parent_object_id) 'Parent table', 
c.NAME 'Parent column name', 
OBJECT_NAME(referenced_object_id) 'Referenced table', 
cref.NAME 'Referenced column name' 
FROM 
sys.foreign_key_columns fkc 
INNER JOIN 
sys.columns c 
    ON fkc.parent_column_id = c.column_id 
     AND fkc.parent_object_id = c.object_id 
INNER JOIN 
sys.columns cref 
    ON fkc.referenced_column_id = cref.column_id 
     AND fkc.referenced_object_id = cref.object_id where OBJECT_NAME(parent_object_id) = 'tablename' 

Если вы хотите, чтобы получить внешний ключ отношения всех таблиц исключить where пункт еще написать имя_таблицы вместо tablename

Смежные вопросы