Перечислите все внешние ключи таблицы, несколько внешних ключей в одну таблицу

Я использую следующий SQL для запроса ключей данной таблицы (первичных и внешних ключей) и их описаний. Я использую SQL Server 2005.

SELECT c.name 'Column Name' , t.name 'Data type' , c.max_length 'Max Length' , c.precision , c.scale , c.is_nullable , ISNULL(i.is_primary_key, 0) 'Primary Key' , CAST (( SELECT COUNT(*) FROM ( SELECT cx.object_id FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cx ON fkc.parent_column_id = cx.column_id AND fkc.parent_object_id = cx.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cx.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) xxx ) AS BIT) AS 'Foreign Key' , ( SELECT OBJECT_SCHEMA_NAME(fkc.referenced_object_id) FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id AND fkc.parent_object_id = cy.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cy.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) 'Schema Name' , ( SELECT OBJECT_NAME(referenced_object_id) FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id AND fkc.parent_object_id = cy.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cy.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) 'Referenced table' , ( SELECT cref.name FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id AND fkc.parent_object_id = cy.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cy.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) 'Referenced column name' , ( SELECT sep.value [Description] FROM sys.extended_properties sep WHERE OBJECT_ID('[dbo].Cards') = sep.major_id AND c.column_id = sep.minor_id ) Description FROM sys.columns c INNER JOIN sys.types t ON c.user_type_id = t.user_type_id LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE c.object_id = OBJECT_ID('[dbo].Cards'); 

Запрос работает очень хорошо для всех таблиц, если только таблица не имеет двух внешних ключей к одной таблице.

Ошибка, которую я получаю,

 "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression." 

Что я делаю не так?

    Я не проверял ваш второй запрос, но проблема все еще существует: подзапрос, который возвращает более 1 значения, – это

     ( SELECT sep.value [Description] FROM sys.extended_properties sep WHERE OBJECT_ID('person.stateProvince') = sep.major_id AND c.column_id = sep.minor_id ) Description 

    вы должны добавить дополнительное условие в предложение where:

     and class = 1 -- OBJECT_OR_COLUMN 

    ваш запрос не учитывает более 1 индекса для таблицы, присоединяется к c.column_id = sep.minor_id, вы получаете больше строк, потому что когда класс равен 7 (индекс) minor_id – это идентификатор индекса, а не идентификатор столбца

    Я решил свою проблему.

    Проводятся здесь, если кто-то наткнется на этот вопрос.

     SELECT c.name 'Column Name' , t.name 'Data type' , c.max_length 'Max Length' , c.precision , c.scale , c.is_nullable , ISNULL(i.is_primary_key, 0) 'Primary Key' , CAST (( SELECT COUNT(*) FROM ( SELECT cx.object_id FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cx ON fkc.parent_column_id = cx.column_id AND fkc.parent_object_id = cx.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cx.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) xxx ) AS BIT) AS 'Foreign Key' , ( SELECT TOP 1 OBJECT_SCHEMA_NAME(fkc.referenced_object_id) FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id AND fkc.parent_object_id = cy.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cy.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) 'Schema Name' , ( SELECT TOP 1 OBJECT_NAME(referenced_object_id) FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id AND fkc.parent_object_id = cy.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cy.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) 'Referenced table' , ( SELECT TOP 1 cref.name FROM sys.foreign_key_columns fkc INNER JOIN sys.columns cy ON fkc.parent_column_id = cy.column_id AND fkc.parent_object_id = cy.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id WHERE cy.column_id = c.column_id AND fkc.parent_object_id = OBJECT_ID('[dbo].Cards') ) 'Referenced column name' , ( SELECT sep.value [Description] FROM sys.extended_properties sep WHERE OBJECT_ID('[dbo].Cards') = sep.major_id AND c.column_id = sep.minor_id ) Description FROM sys.columns c INNER JOIN sys.types t ON c.user_type_id = t.user_type_id LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE c.object_id = OBJECT_ID('[dbo].Cards'); 
    Interesting Posts

    SQL Server – поиск строки с международными символами с использованием предложения LIKE

    Могу ли я использовать членство в ASP.NET с SQL Server Compact Edition?

    Как получить идентификатор новых записей INSERTED в таблицу с триггером INSTEAD OF

    SQL – Лучше два запроса вместо одного большого

    Любые хорошие инструменты для автоматизации задач управления SQL Server?

    Нечетные символы, показывающие небольшой стол после использования tableDiff

    Проблема сериализации хранимой процедуры

    Как преобразовать XML-поле с более чем 8000 символами в строку?

    Где все сеансы SQL Server?

    Возврат Макс. Из подмножества SQL

    Как удалить все хранимые процедуры сразу в базе данных SQL Server?

    Как включить пустые строки в один SQL-запрос GROUP BY DAY (date_field)?

    Загрузите извлечение пользователя с помощью хранимой процедуры

    Как получить подстроку в SQL Server?

    Чтобы закрепить строки в течение недельных дней

    Давайте будем гением компьютера.