SQLServer: How to sort table names ordered by their foreign key dependency

前端 未结 4 1430
后悔当初
后悔当初 2020-12-23 22:39

The following SQL separates tables according to their relationship. The problem is with the tables that sort under the 3000 series. Tables that are part of foreign keys and

4条回答
  •  醉酒成梦
    2020-12-23 23:04

    My rendition with moderate tweaks: This one is SQL-2005+ and works on databases without the "rowguidcol":

    WITH TablesCTE(SchemaName, TableName, TableID, Ordinal) AS
    (
        SELECT
            OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
            OBJECT_NAME(so.object_id) AS TableName,
            so.object_id AS TableID,
            0 AS Ordinal
        FROM
            sys.objects AS so
        WHERE
            so.type = 'U'
            AND so.is_ms_Shipped = 0
        UNION ALL
        SELECT
            OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
            OBJECT_NAME(so.object_id) AS TableName,
            so.object_id AS TableID,
            tt.Ordinal + 1 AS Ordinal
        FROM
            sys.objects AS so
        INNER JOIN sys.foreign_keys AS f
            ON f.parent_object_id = so.object_id
            AND f.parent_object_id != f.referenced_object_id
        INNER JOIN TablesCTE AS tt
            ON f.referenced_object_id = tt.TableID
        WHERE
            so.type = 'U'
            AND so.is_ms_Shipped = 0
    )
    
    SELECT DISTINCT
            t.Ordinal,
            t.SchemaName,
            t.TableName,
            t.TableID
        FROM
            TablesCTE AS t
        INNER JOIN
            (
                SELECT
                    itt.SchemaName as SchemaName,
                    itt.TableName as TableName,
                    itt.TableID as TableID,
                    Max(itt.Ordinal) as Ordinal
                FROM
                    TablesCTE AS itt
                GROUP BY
                    itt.SchemaName,
                    itt.TableName,
                    itt.TableID
            ) AS tt
            ON t.TableID = tt.TableID
            AND t.Ordinal = tt.Ordinal
    ORDER BY
        t.Ordinal,
        t.TableName
    

提交回复
热议问题