2010-01-26 34 views
2

我想知道哪些记录最后一行是最后按以下顺序插在详细表B ...例如,如果我有:如何识别一个INSERT语句

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) 

我想做的事情一些T-SQL或运行一个过程,如果插入4行...在此先感谢!

使用SQL-Server 2000

+1

您可能想要更好地格式化您的示例。这是很难理解的。代码块可能会有所帮助。 – 2010-01-26 19:58:30

+0

需要更清晰的说明。 – 2010-01-26 19:59:10

+0

为什么你有列名为[1],[行],[标题],[表]和[A]?!?这是没有意义的! – RBarryYoung 2010-01-26 20:57:48

回答

1

astander的链接看一看作为建议上面,然后也许看特殊的inserted和deleted表创建和使用触发器触发一些帮助。

两个特殊的表在触发器语句中使用:deleted表和inserted表。 Microsoft®SQL Server自动创建和管理这些表。您可以使用这些临时的内存驻留表来测试某些数据修改的影响并设置触发操作的条件;但是,您不能直接更改表中的数据。

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

当你做你插入你可能查询插入表中找到的最后一行是通过它推。

4

根据定义,SQL表没有默认排序。因此,您无法可靠地根据“详细信息”表中的行排序来确定此值。您将需要添加某种数字列,其中包含您插入行的顺序。

+0

yes是一个自动数字列 – 2010-01-27 14:33:28

0

这是否表有标识列(例如, “TableBId”)?这是Randy Minder在他的回答中提到的数字列。如果它不那么它是很容易只需要使用ORDER BY功能:

SELECT TOP 1 * FROM TableB ORDER BY Id DESC 

如果没有标识列,那么你可以通过创建一个新的列(Id)的加一,设置它作为主键并将其设置为标识规范。

如果你想运行一个新的项目后,一些SQL插入你可以使用一个INSERT触发器的表。

可以阅读或triggers here看看下面:)

0

使用IDENTITY来确定最后插入的记录可能会非常具有误导性。如果某些记录已被删除,并且您已重置您的IDENTITY起始值?

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

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

你如何插入记录?通过应用程序?

我会建议看添加一个时间戳列(或甚至只是一个常规的DATETIME列与默认值GETDATE())。这可以帮助确定您的交易中最后插入了哪条记录。例如:

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