我想知道哪个记录是最后一次按照以下顺序插入到详细信息表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
答案 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