首页 > 解决方案 > 如何在 C# 中仅删除距当前日期超过 30 天的前 100 行?

问题描述

当我执行以下查询时,它在 SSMS 中正确执行,但代码中的相同查询不会删除任何内容,并且 0 行受到数千行的影响。

代码执行没有任何错误,也尝试过查询参数但没有成功。

Logs 是表,DateCreated 是 DateTime 的列。Sql Connection设置和其他东西都正确。

SSMS 查询执行如下:

在此处输入图像描述

有人可以更正此代码查询吗?

                connection.Open();                                       
                SqlCommand cmd1 = new SqlCommand("delete TOP (100) from [Logs] WHERE DateCreated < GETDATE() - 30", connection);
          
                var number_of_rows_deleted = cmd1.ExecuteNonQuery();
                result = number_of_rows_deleted.ToString() + " records deleted";

标签: c#sqlado.net

解决方案


当 TOP 与 DELETE 一起使用时,引用的行不按任何顺序排列,并且不能在该语句中直接指定 ORDER BY 子句。如果您需要使用 TOP 以有意义的时间顺序删除行,则必须在 subselect 语句中使用 TOP 和 ORDER BY 子句

你的 sql 脚本应该是这样的

DELETE from [Logs] 
WHERE Id IN  
 (SELECT TOP(100) Id
   FROM Logs
   WHERE  DATEDIFF(day, DateCreated, GETDATE()) < 30
  Order By DateCreated )

推荐阅读