1

Trackerデータベース ( ) とテーブル ( Work)に基づいて列のメタデータを検索するクエリを作成しました。

SELECT      Cols.Name,
            TYPE_NAME(Cols.user_type_id) Type,
            CAST(ISNULL(OBJECTPROPERTY(OBJECT_ID(Keys.CONSTRAINT_NAME), 'IsPrimaryKey'), 0) AS BIT) PrimaryKey,
            Cols.is_identity [Identity],
            Cols.is_nullable Nullable,
            CAST(ColumnProperty(object_id, Cols.name, 'IsComputed') AS BIT) Computed,
            CASE WHEN Cons.CONSTRAINT_TYPE IS NULL THEN NULL ELSE Keys.CONSTRAINT_NAME END ForeignKey
FROM        sys.columns Cols

LEFT JOIN   INFORMATION_SCHEMA.KEY_COLUMN_USAGE Keys
ON          Keys.COLUMN_NAME = Cols.name
AND         Keys.TABLE_CATALOG = 'Tracker'
AND         Keys.TABLE_NAME = 'Work'

LEFT JOIN   INFORMATION_SCHEMA.TABLE_CONSTRAINTS Cons
ON          Cons.CONSTRAINT_NAME = Keys.CONSTRAINT_NAME
AND         Cons.CONSTRAINT_TYPE = 'FOREIGN KEY'

WHERE       Cols.object_id = OBJECT_ID('Work')
ORDER BY    Cols.column_id ASC

これにより、次の結果が生成されます。

外部キーの関係情報を検索するために、次のクエリも作成しました。

SELECT      OBJECT_NAME(FKCols.referenced_object_id) ForeignTable,
            Cols.name ForeignColumn
FROM        sys.foreign_key_columns FKCols

LEFT JOIN   sys.foreign_keys FKs
ON          FKCols.constraint_object_id = FKs.object_id

LEFT JOIN   sys.columns Cols
ON          Cols.object_id = FKs.referenced_object_id

WHERE       Cols.column_id = FKCols.referenced_column_id
AND         FKs.name = 'FK_Work_Tasks'

これが生成されます:

ここまで来るのに数時間かかりましたが、本当に困っています。私はこのような結果を得ようとしています:

これらのクエリをマージするにはどうすればよいですか?

これをDBAに投稿するつもりでしたが、これが基本的な SQL クエリまたは高度な SQL クエリ (オフトピック/オントピック) の権限に該当するかどうかはわかりませんでした。

また、ここで使用できる最適化を誰かが指摘できれば、それも大歓迎です!

4

2 に答える 2

0

必要な外部列データ (ForeignTableおよびForeignColumn) を取得するには、もう少し複雑な結合を使用しsys.foreign_key_columnsて両方を取得できます。

変更された SQL

SELECT      Cols.Name,
            TYPE_NAME(Cols.user_type_id) Type,
            CAST(ISNULL(OBJECTPROPERTY(OBJECT_ID(Keys.CONSTRAINT_NAME), 'IsPrimaryKey'), 0) AS BIT) PrimaryKey,
            Cols.is_identity [Identity],
            Cols.is_nullable Nullable,
            --specified Cols.object_id here to remove ambiguous column error
            CAST(ColumnProperty(Cols.object_id, Cols.name, 'IsComputed') AS BIT) Computed, 
            CASE WHEN Cons.CONSTRAINT_TYPE IS NULL THEN NULL ELSE Keys.CONSTRAINT_NAME END ForeignKey,
            --new FK info columns
            OBJECT_NAME(FKCols.referenced_object_id) ForeignTable,
            FKColsInfo.name as ForeignColumn
FROM        sys.columns Cols

LEFT JOIN   INFORMATION_SCHEMA.KEY_COLUMN_USAGE Keys
ON          Keys.COLUMN_NAME = Cols.name
AND         Keys.TABLE_CATALOG = 'Tracker'
AND         Keys.TABLE_NAME = 'Work'

LEFT JOIN   INFORMATION_SCHEMA.TABLE_CONSTRAINTS Cons
ON          Cons.CONSTRAINT_NAME = Keys.CONSTRAINT_NAME
AND         Cons.CONSTRAINT_TYPE = 'FOREIGN KEY'

--JOIN that will fetch both the foreign key table name and the associated column name in that table
LEFT JOIN   (
                sys.foreign_key_columns FKCols LEFT JOIN sys.columns FKColsInfo 
                ON FKColsInfo.object_id = FKCols.referenced_object_id
                AND FKColsInfo.column_id = FKCols.referenced_column_id
            )
ON          FKCols.parent_object_id = Cols.object_id
AND         FKCols.parent_column_id = Cols.column_id

WHERE       Cols.object_id = OBJECT_ID('Work')
ORDER BY    Cols.column_id ASC
于 2013-09-08T10:43:02.247 に答える