【问题标题】:How to delete only Top 100 rows which are older than 30 days from current date in C#? [closed]如何在 C# 中仅删除距当前日期 30 天以上的前 100 行? [关闭]
【发布时间】:2021-11-09 03:38:02
【问题描述】:

当我执行以下查询时,它在 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";

【问题讨论】:

  • 这需要一个 ORDER BY 子句。
  • 另外:你有错误吗?这里是否有可能隐藏错误的尝试/捕获?连接字符串是否与 SSMS 连接的用户/登录名相同?除了dbo,是否还有其他架构,因为未运行的查询中缺少这些架构?
  • 除了您引用表格的方式之外,SSMS 和点网代码查询是相同的,所以您(选择一个): 没有使用相同的连接;收到您未共享的错误;由于某些程序流逻辑(在该行设置断点并进行调试),实际上并没有访问该代码;我想就是这样......
  • 愚蠢,但我不得不问。使用 SSMS 删除 100 行后,您是否恢复了表?或者您还有另外一组 100 行要删除吗?
  • @JoelCoehoorn,已更新问题。代码执行没有错误,有数千条记录,正如我所说的,只有查询需要更正。

标签: c# sql ado.net


【解决方案1】:

当 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 )

【讨论】:

  • 感谢 Serge,它成功了!
  • 不客气!
  • Serge 您能否编辑问题以使其与答案匹配?看起来确实与 C# 没有任何关系,而且@Pratikwasnik 没有可用的 SQL 语句开始(尽管图片很酷)。将图像转换为文本也很好......
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2016-05-17
  • 2023-04-10
  • 2021-12-19
  • 2017-11-24
  • 1970-01-01
相关资源
最近更新 更多