如何识别插入语句的最后一行

时间:2010-01-26 19:56:25

标签: sql sql-server tsql sql-server-2000

我想知道哪个记录是最后一次按照以下顺序插入到详细信息表B上...例如,如果我有:

1 row Header Table A
--------------------
1 row Detail Table B
2 row Detail Table B
3 row Detail Table B
4 row Detail Table B (last)

如果插入4行,我想做一些T-SQL或运行程序...提前谢谢!

使用SQL-Server 2000

5 个答案:

答案 0 :(得分:4)

根据定义,SQL表没有隐含的排序。因此,您无法根据Detail表中的行顺序可靠地确定这一点。您需要添加某种数字列,其中包含插入行的顺序。

答案 1 :(得分:2)

答案 2 :(得分:1)

如上所述,看一下触发器的一些帮助,然后查看触发器创建和使用的特殊插入和删除表。

在触发器语句中使用了两个特殊的表:已删除的表和插入的表。 Microsoft®SQLServer自动创建和管理这些表。您可以使用这些临时的,驻留内存的表来测试某些数据修改的效果,并为触发操作设置条件;但是,您无法直接更改表中的数据。

通过触发器插入或删除的每一行都是通过我相信的这些表来完成的。

在执行插入操作时,您可以查询插入表以查找推送它的最后一行。

答案 3 :(得分:0)

该表是否有标识列(例如,“TableBId”)?这是Randy Minder在他的回答中谈到的数字专栏。如果确实如此,那么只需使用ORDER BY函数:

SELECT TOP 1 * FROM TableB ORDER BY Id DESC

如果您没有标识列,则可以通过创建新列(Id),将其设置为主键并设置其标识规范来添加标识列。

如果要在将新项目插入表格后运行某些sql,可以使用插入触发器。

可以阅读triggers here或查看下面的旁观者链接:)

答案 4 :(得分:0)

使用IDENTITY确定最后插入的记录可能会产生误导。如果某些记录已被删除,并且您已重置IDENTITY起始值,该怎么办?

例如,您可能有1到10000的记录,但是从1000-9000删除,并且您决定重置您的身份以便在1000再次开始?

另一方面,触发器可以起作用,但是你需要仔细权衡后果。这可能会给系统增加很多负载。

您是如何插入记录的?通过申请?

我建议添加一个timestamp列(或者甚至只是一个默认值为GETDATE()的常规DATETIME列)。这有助于确定在您的交易中最后插入的记录。例如:

-- begin your transaction 

-- insert statements here 

SELECT id
FROM TableB
WHERE timestampcol = (SELECT MAX(timestampcol) FROM TableB)

-- run your sproc based on the last record inserted

-- commit or rollback your transaction