我通過類似這樣的查詢插入記錄:如何檢索通過插入插入的行的標識... select?
insert into tbl_xyz select field1 from tbl_abc
現在我想中檢索的記錄插入新生成的標識值。我如何以最小的鎖定和最大的可靠性來做到這一點?
我通過類似這樣的查詢插入記錄:如何檢索通過插入插入的行的標識... select?
insert into tbl_xyz select field1 from tbl_abc
現在我想中檢索的記錄插入新生成的標識值。我如何以最小的鎖定和最大的可靠性來做到這一點?
你可以使用OUTPUT這條信息。
您可以將您的信息輸出到臨時目標表或視圖。
下面是一個例子:
DECLARE @InsertedIDs TABLE (ID bigint)
INSERT into DestTable (col1, col2, col3, col4)
OUTPUT INSERTED.ID INTO @InsertedIDs
SELECT col1, col2, col3, col4 FROM SourceTable
然後,您可以查詢您的插入ID的表InsertedIDs。
SELECT @@IDENTITY
這就是我以前做過的。不知道這是否會滿足您的後半部分。
編輯
發現這個鏈接太多,但不知道這是否是一樣的...
How to insert multiple records and get the identity value?
@@ IDENTITY將返回最後插入IDENTITY值,所以你有兩個可能出現的問題
小心插入table_xyz時,因爲這可能會改變@@ IDENTITY值觸發器執行的。
tbl_abc是否有多行。 ()代替@@ IDENTITY 第2期就不好辦瞭如果是這樣那麼@@ IDENTITY將只返回最後一行
問題1的標識值可以通過SCOPE__IDENTITY解決。 tbl_abc中的field1是否在tbl_xyz中定義了唯一記錄,如果是這樣,您可以使用標識列重新選擇table_xyz中的數據。還有其他解決方案使用CURSORS,但這些將會很慢。
據我所知,你不能在同一個腳本中直接使用SQL。但是你可以創建一個INSERT觸發器。現在,我討厭觸發器,但它是這樣做的一種方式。
根據您正在嘗試執行的操作,您可能需要先將行插入臨時表或表變量中,然後以這種方式處理結果集。希望有一個可以鏈接到的獨特列。你也可以鎖定表格,獲得最大密鑰,插入你的行,然後再次獲得你的最大密鑰,並做一個範圍。
觸發:
--Use the Inserted table. This conaints all of the inserted rows.
SELECT * FROM Inserted
臨時表:
insert field1, unique_col into #temp from tbl_abc
insert into tbl_xyz (field1, unique_col) select field1, unique_col from tbl_abc
--This could be an update, or a cursor, or whatever you want to do
SELECT * FROM tbl_xyz WHERE EXISTS (SELECT top 1 unique_col FROM #temp WHERE unique_col = tbl_xyz.unique_col)
主要範圍:
Declare @minkey as int, @maxkey as int
BEGIN TRANS --You have to lock the table for this to work
--key is the name of your identity column
SELECT @minkey = MAX(key) FROM tbl_xyz
insert into tbl_xyz select field1 from tbl_abc
SELECT @maxkey = MAX(key) FROM tbl_xyz
COMMIT Trans
SELECT * FROM tbl_xyz WHERE key BETWEEN @minkey and @maxkey
這隻會retreive的身份插入最後一條記錄我需要檢索他們所有人 – Manu 2009-02-22 17:26:39
我正在使這個最喜歡的問題。我也想知道答案:) – RSolberg 2009-02-22 17:28:31