0

假设我有表 A 和 B。表 A 对表 B 有一个 FK。

我可以将 B 中的记录分类为“已引用”和“未引用”,这意味着数据库中的某些记录分别具有指向或不指向该记录的 FK。

我想找到一种与方案无关的方法来删除 B 中未引用的所有行。在没有任何约束的情况下对表 B 进行简单的 DELETE 操作(因为我想要独立于方案,即一种通用方式),几乎可以肯定,它会失败。

如果它也可以独立于供应商,那就太好了,但我觉得我要求太多了。

编辑:也许我不清楚。当我说我不想依赖该方案时,我指的是在执行“删除”时避免从其他表中命名列名。只需删除 B 的记录,这些记录可以在不破坏数据库一致性的情况下删除。

4

1 回答 1

0

缓慢的方式:

declare del_cur cursor
local
forward_only
static
scroll_locks
for
  select 0 from B
;

declare @foo int;

open del_cur;

fetch next from del_cur into @foo;
while @@fetch_status = 0
begin
  begin try
    delete from B where current of del_cur;
  end try
  begin catch
    -- It was referenced, skip
  end catch;

  fetch next from del_cur into @foo;
end;

close del_cur;
deallocate del_cur;

一种更快的方法是检查现有的外键并构建包含其列名的动态 SQL 语句。

于 2013-01-20T13:39:02.777 回答