【问题标题】:picking last records inserted into table [closed]挑选最后插入表的记录[关闭]
【发布时间】:2014-05-21 12:46:51
【问题描述】:

我在 table1 中插入了 4 条记录,然后是 5 条记录,然后是 3 条记录。 现在我想提取最后 3 条记录,或者说任意数量的记录,但最后插入。我将如何获得这些?

实际情况是,在 gridview 1 中,用户将通过复选框字段选择说 3 条记录,然后将这 3 条记录插入到 table1 中,然后存储过程将选择最后插入的 3 条记录并将其分配给 RDLC 报告。一切都完成了,只是不知道如何选择最后插入的任意数量的记录。

【问题讨论】:

  • 您必须手动跟踪最后插入的记录,因为数据库无法为您做到这一点。
  • 你能展示一下你的桌子设计吗?
  • 你有 row-id 或时间戳吗?
  • 可以在sql查询中使用limit关键字
  • 你的表中是否有 created_date 列,如果没有,则使用默认值 getdate() 创建一个。

标签: c# asp.net sql ado.net


【解决方案1】:

根据定义,表是一组无序的行。除非您在与插入相同的批处理中这样做,否则无法询问 SQL Server 最后插入哪一行。例如,如果您的表有一个 IDENTITY 列,您可以说:

插入 dbo.table(column) 值 (...) SELECT SCOPE_IDENTITY();

但这也会给你最后的第一个身份列。

您可以在这里做的是,您可以借助时间戳并将其定义在表格的单独列中。

ALTER TABLE dbo.table ADD DateInserted DEFAULT CURRENT_TIMESTAMP;

使用您将存储在服务层中以调用的@lastrows 计数定义存储过程。

CREATE PROC sp_GetLastInsertedRows(@lastrows int) 作为

;WITH x AS (SELECT *, r = ROW_NUMBER() OVER (ORDER BY DateInserted DESC) 来自 dbo.table) SELECT * FROM x WHERE r

这样你就得到了最后一个事务中插入的最后 N 行。

【讨论】:

  • 让我补充两点:根据SQL标准不仅行没有顺序,列也没有顺序。回到最初的问题:你不能这样做,也不应该这样做!如果你需要它,你必须通过将相关信息添加到你的表格设计中来提供方法,比如 rowNumber 或 insertDateTime柱子。但在许多真正的 DBMS 系统中,您可以绕过标准并使用它们的 rowID 等。
【解决方案2】:

您可以使用下面提到的查询

 SELECT column_name FROM table_name
ORDER BY column_name DESC
LIMIT 3;

【讨论】:

  • 限制不固定,可以是任意数字
  • opps...那么你必须为创建日期创建一个coloum并尝试根据创建日期过滤记录
【解决方案3】:

好的,所以你需要一些更灵活的东西。现在您可能只有一个用户,并且现在您可能在执行INSERT 语句后立即运行报告,但您真正需要知道的是自上次查看以来哪些行是新的。

这样做的一个好方法是在行中添加一个DATETIME NULL 字段;我们称之为processed_date。该字段将由为报告选取它们的存储过程更新。像这样的:

SELECT * FROM tbl1
INTO #report_tbl
WHERE processed_date IS NULL

UPDATE tbl1
SET processed_date = GETDATE()
WHERE id_field IN (
    SELECT id_field
    FROM #report_tbl
)

现在您肯定会选择“尚未查看”的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多