2010-01-26 57 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