私はあなたの順序を得るための手順を構築することができると思います。ここにアイディアがあります:
CREATE PROCEDURE get_delete_order
@tablename varchar(MAX)
as
BEGIN
-- Get directed related tables
SELECT base.name base_name
, related.name rel_name
into #RELATED_TABLES
FROM sys.sysobjects base
left join sys.sysforeignkeys on fkeyid = base.id
left join sys.sysobjects related on related.id = rkeyid
and related.id <> base.id
and related.xtype = 'U'
WHERE base.xtype = 'U'
and base.name = @tablename
-- Get indirected related tables using recursive call
CREATE #ALL_RELATED_TABLES (rel_name varchar(max), del_order int)
INSERT INTO #ALL_RELATED_TABLES (rel_name, del_order)
SELECT rel_name
, -1
FROM #RELATED_TABLES
DECLARE @relate_table
DECLARE IND_REL CURSOR FOR
SELECT rel_Name
FROM #RELATED_TABLES
open IND_REL
fetch next from IND_REL into @relate_table
-- TODO: IMPORTANT!!! Avoid infinite loop here
while (@@FETCH_STATUS = 0)
begin
INSERT INTO #ALL_RELATED_TABLES (rel_name, del_order)
exec get_delete_order(@relate_table)
fetch next from IND_REL into @relate_table
end
close IND_REL
deallocate IND_REL
-- Return resultset
SELECT rel_name
, del_order + 1
FROM #ALL_RELATED_TABLES
ORDER BY del_order DESC
END
これはテストされていません。 実際の手順はもっと複雑になります:)
こんにちはフレッド。私はSQL Compareのプロダクトマネージャーです。 SQL Server 2008 R2をサポートしています。過去にこれに問題があった場合、それ以降解決されたバグを見つけた可能性があります。これをもう一度やり直すことができますか?問題がある場合は、red-gate dot comのDavid dot Atkinsonに直接メールしてください。 –
デビッド、ごめんなさい、私があなたの製品を嫌っているのですが、上記のことを言っているあなたの販売員からのメールがあります(彼はあなたが数ヶ月でそれをサポートしてくれると言っていました)また、「バージョンがサポートされていません」というメッセージを表示してデータベースを開くことができませんでした。上記の質問をするツールの試用版へのリンクがありますか? –
削除を実行するための1つの「注文」はないかもしれません。循環参照がある場合(自己参照、またはより大きなサイクルのいずれか)、サイクルを最初に中断する必要があります。 –