Điều này sẽ giúp bạn có được bảng theo thứ tự quan trọng nước ngoài và tránh thả một số các bảng được tạo ra bởi SQL Server. Giá trị t.Ordinal
sẽ chia các bảng thành các lớp phụ thuộc.
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
AND OBJECT_NAME(so.object_id)
LIKE 'MyPrefix%'
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
AND OBJECT_NAME(so.object_id)
LIKE 'MyPrefix%'
)
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 DESC, t.TableName ASC
Nguồn
2014-02-10 08:04:44
Bạn có thể phải chạy tập lệnh này nhiều lần vì các ràng buộc khóa ngoài giữa bảng chính và bảng chi tiết. –
Trong SQL Server 2005, tôi đã phải thay đổi hai dòng cuối thành 'close cmds; deallocate cmds'. –
* Cảnh báo *: Giải pháp này cũng có thể xóa bảng do SQL Server tạo! Giải pháp của tôi dưới đây tránh điều này và xóa bảng theo thứ tự phụ thuộc chính của nước ngoài. –