从数据库的所有表中仅保留最新的10000行

时间:2018-08-13 08:38:40

标签: sql sql-server sql-server-2008

我正在开发在旧数据库上运行的应用程序。由于数据库的大小很大,因此我想从每个表中删除除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'

我在许多表上收到错误消息“子查询返回了多个值...”。我该如何修改?

1 个答案:

答案 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";