我正在开发在旧数据库上运行的应用程序。由于数据库的大小很大,因此我想从每个表中删除除N = 10000以外的所有行,然后才能将该数据库导入笔记本电脑。以下是代码:
exec sp_MSforeachtable 'with cte as(select top
(
CASE
WHEN (select count(*) - 10000 from ?) <= 0 THEN 0
ELSE (select count(*) - 10000 from ?)
END
)
* from ?) delete from cte'
我在许多表上收到错误消息“子查询返回了多个值...”。我该如何修改?
答案 0 :(得分:0)
如果我们假设您没有前键,可以尝试这样的操作
exec sp_MSforeachtable 'delete f1 from (
select *, row_number() over(order by (select null)) rang
from ?
) f1 where f1.rang>10000'
如果要禁用所有约束并在删除后启用,则可以执行此操作(但不正确):
exec sp_MSforeachtable @Command1="ALTER TABLE ? NOCHECK CONSTRAINT all";
exec sp_MSforeachtable "delete f1 from (select *, row_number() over(order by (select null)) rang from ? ) f1 where f1.rang>10000";
exec sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all";