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

Sql 仅保留数据库所有表中最新的10000行,sql,sql-server,sql-server-2008,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 ) *

我正在开发一个在遗留数据库上运行的应用程序。因为数据库的大小非常大,所以在将该数据库导入笔记本电脑之前,我想从每个表中删除除最新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。。。在许多桌子上。如何修改此项?

如果我们假设您没有forey键,您可以尝试类似的方法

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

这将创建一个数据集,该数据集不太可能是引用完整的,并且能够创建一个全新的问题/缺陷部分。我建议您研究提供正确有效数据集的替代方法。选择顶部。。?您的整数值和ORDER BY在哪里?我不知道这个子查询如何返回多个值,因为如果没有Where子句,则select count*-*CONTANTER*FROMSOMETABLE应该始终只返回一行。您能否提供一个?定义:非常大?您是否尝试过压缩/缩小数据库?正如安德鲁所说,你的要求不太可能奏效。如果您确实需要通过删除数据来清理数据库,那么您必须正确地进行操作,没有捷径可以获得良好的干净数据。否则,如果您希望使用某个内容进行测试,请编写架构脚本并添加您自己的测试数据。在Management Studio中,您可以使用“生成脚本”任务生成空数据库DBCC CLONEDATABASE的备份是SQL Server最新版本中的另一个选项,然后,使用导入/导出向导仅导入带有查询的每个表中的最后10000行。通常,导入所需数据要比首先删除大量不需要的数据快得多。作为奖励,如果结果仍然不符合您的喜好,则可以重复。请阅读Andrew在帖子上的评论,由于引用完整性,这不太可能起作用。不能只删除数据而不产生任何后果。