2017-05-10 16 views
3

다음 SQL을 사용하여 주어진 테이블의 키 (기본 키와 외래 키) 및 해당 설명을 쿼리합니다. SQL Server 2005를 사용하고 있습니다.테이블의 모든 외래 키, 같은 테이블의 여러 외래 키 나열

동일한 테이블에 두 개의 외래 키가없는 경우가 아니면 모든 테이블에 대해 쿼리가 잘 작동합니다. 내가 잘못하고있는 중이 야 내가지고있어 오류가

,

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

?

답변

1

나는 두 번째 쿼리를 확인하지 않았다하지만 문제는 아직 거기 : 1 개 이상의 값을 returnes 서브 쿼리이 하나

(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 

이상의 행을 얻을 c.column_id = sep.minor_id 당신 고양이에 합류, 테이블 1 개 이상의 인덱스를 고려하지 않는 쿼리 때문에 때 클래스 I s 7 (색인) minor_id는 열 ID가 아닌 색인 ID입니다

+0

답장을 보내 주셔서 감사합니다! 문제는 쿼리의 세 부분에 TOP 1을 추가하여 해결됩니다. 나를 위해 충분한 작품 :) – Excessive

0

나는 내 자신의 문제를 해결했습니다.

누군가이 질문에 비틀 거린 경우 여기에 게시하십시오.

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');