2016-12-06 7 views
2

В Microsoft SQL, если я хочу, чтобы получить информацию о том, где столбец с определенным именем столбца появляется в моей базе данных, я могу запустить этот запрос:Как найти таблицу с первичным ключом с определенным именем столбца в Microsoft SQL?

select * from information_schema.columns where column_name = 'XXXXX'; 

Этот запрос возвращает большое количество информации о случаях, когда появляется столбец с именем, но я ничего не вижу о ссылочных ограничениях.

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

select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
select * from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 

Я хочу написать запрос, который будет делать что-то вроде этого:

select table_schema, table_name from INFORMATION_SCHEMA.COLUMNS 
where column_name = 'XXXXX' and IsPrimaryKey = 1; 

Редактировать: Было высказано предположение, что этот вопрос дублирует вопрос о поиске первичного ключа данной таблицы. Этот вопрос связан, но отличается тем, что я начинаю знать имя столбца (это может произойти во многих таблицах), и я хочу узнать, есть ли таблица с столбцом первичного ключа с тем же именем.

+0

Если ваш PRIMARY_KEY является кластеризованным ключом, то это таблица. – DVT

+2

http://stackoverflow.com/questions/3930338/sql-server-get-table-primary-key-using-sql-query – SQLChao

+0

Какая версия SQL Server? –

ответ

1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1 
AND COLUMN_NAME = 'ColumnName' AND TABLE_SCHEMA = 'SchemaName' 
+0

Не знаете, почему это было приостановлено, но оно работает. Я бы изменил 'table_name' на' * 'и удалил' и table_schema ... 'не уверен, что это было. +1 – SqlZim

1
SELECT 
    s.name AS schema_name, 
    o.name AS table_name 
    --, * 
FROM sys.objects o 
    join sys.schemas s on s.schema_id = o.schema_id 
    join sys.indexes i on i.object_id = o.object_id 
    join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and i.name = 'XXXXX'; 

EDIT:

Я написал первый способ показать, что PKs не всегда один столбец, но забыл отметить, что и удалить лишние строки. Вот версия, которая возвращает единственный результат.

SELECT 
    s.name AS schema_name, 
    o.name AS table_name 
    --, * 
FROM sys.objects o 
    join sys.schemas s on s.schema_id = o.schema_id 
    join sys.indexes i on i.object_id = o.object_id 
    --join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    --join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and i.name = 'XXXXX'; 

EDIT 2

Оригинальный вопрос был немного неясно, как отметил SqlZim. Если вы хотите спросить по имени столбца, я добавил эту опцию. ПРЕДУПРЕЖДЕНИЕ. Это приведет к возврату нескольких таблиц, если у вас есть таблицы с тем же именем столбца, что и PK. Это, скорее всего, в больших базах данных и многих сложных ключах (например, в финансовой системе, где нечто вроде FinancialYear часто является частью многих составных ключей).

SELECT 
    s.name AS schema_name, 
    o.name AS table_name 
    --, * 
FROM sys.objects o 
    join sys.schemas s on s.schema_id = o.schema_id 
    join sys.indexes i on i.object_id = o.object_id 
    join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and c.name = 'PROGRAM_YEAR'; 
+0

Для поиска по имени столбца это должно быть 'c.name = ...' not 'i.name = ...', что означает, что вам нужны последние два соединения. – SqlZim

+0

Вопрос в заголовке - как найти таблицу на основе имени первичного ключа. С другой стороны, его «что-то вроде» указывает имя столбца. Я добавлю вариант. – SMM

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

  • Нет связанных вопросов^_^