2017-05-10 27 views
3

次のSQLを使用して、特定のテーブルのキー(プライマリと外部キー)とその説明を照会します。私はSQL Server 2005を使用しています。テーブルのすべての外部キーと複数の外部キーを同じテーブルに一覧表示する

テーブルが同じテーブルに2つの外部キーを持っていない限り、クエリはすべてのテーブルで非常にうまく動作します。私が間違っているの私は何を取得していますエラーがある

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

答えて

1

私はあなたの2番目のクエリをチェックしませんでしたが、問題はまだそこにある: 1つの以上の値がこの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句で条件を追加する必要がありreturnesサブクエリを:

and class = 1 -- OBJECT_OR_COLUMN 

より多くの行を取得c.column_id = sep.minor_idあなたの猫に参加し、テーブルの1つの以上のインデックスを考慮していないクエリなぜならときに、クラスI s 7(index)minor_idは列IDではなく、インデックスIDです

+0

ありがとうございました!この問題は、クエリの3つのセクションに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'); 
関連する問題