2009-02-22 107 views

回答

19

你可以使用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。

1
SELECT @@IDENTITY 

這就是我以前做過的。不知道這是否會滿足您的後半部分。

編輯
發現這個鏈接太多,但不知道這是否是一樣的...
How to insert multiple records and get the identity value?

+0

這隻會retreive的身份插入最後一條記錄我需要檢索他們所有人 – Manu 2009-02-22 17:26:39

+0

我正在使這個最喜歡的問題。我也想知道答案:) – RSolberg 2009-02-22 17:28:31

2

@@ IDENTITY將返回最後插入IDENTITY值,所以你有兩個可能出現的問題

  1. 小心插入table_xyz時,因爲這可能會改變@@ IDENTITY值觸發器執行的。

  2. tbl_abc是否有多行。 ()代替@@ IDENTITY 第2期就不好辦瞭如果是這樣那麼@@ IDENTITY將只返回最後一行

問題1的標識值可以通過SCOPE__IDENTITY解決。 tbl_abc中的field1是否在tbl_xyz中定義了唯一記錄,如果是這樣,您可以使用標識列重新選擇table_xyz中的數據。還有其他解決方案使用CURSORS,但這些將會很慢。

1

據我所知,你不能在同一個腳本中直接使用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