2012-08-23 83 views
-2

我在TablesAs KeyA列上的TableB上有兩個帶有外鍵約束的表。直到現在我還在進行手動插入,因爲他們只有幾行要添加。現在我需要做一個批量插入,所以我的問題是,如果我在TableA中插入多行,我怎麼能得到所有這些身份值,並將其插入TableB以及其他列值。請參閱下面的腳本。獲取插入的表標識值並更新另一個表

INSERT INTO Tablea 
     ([KeyA] 
     ,[Value]) 
    SELECT 4 ,'StateA' 
UNION ALL 
SELECT 5 ,'StateB' 
UNION ALL 
SELECT 6 ,'StateC' 

INSERT INTO Tableb 
     ([KeyB] 
     ,[fKeyA] //Get value from the inserted row from TableA 
     ,[Desc]) 
SELECT 1 ,4,'Value1' 
UNION ALL 
SELECT 2 ,5,'Value2' 
UNION ALL 
SELECT 3 ,6, 'Value3' 
+4

什麼版本的SQL Server?看看[OUTPUT子句](http://msdn.microsoft.com/en-us/library/ms177564.aspx)。我會提供一個答案,但你對獎勵幫助你的人不感興趣。 –

回答

0

Scope identity sometimes returns incorrect value。請參閱解決方法部分中OUTPUT的使用。

+3

SCOPE_IDENTITY()在這裏無效 - 注意初始命令插入多行; SCOPE_IDENTITY()只返回最後一個。 –

+0

@AaronBertrand - 是的,OP中很清楚。該引用提供了一個使用'OUTPUT'的例子,並提供給那些處理單個行的人,他們可能希望探索標準技術的替代方法:MAX(ID),@@ IDENTITY, 'IDENT_CURRENT('TABLE_NAME')','SCOPE_IDENTITY()'。謝謝你對我的評價。 – HABO

+3

這不一定適合你,但也適用於其他讀者。 –

2

您可以使用INSERT的OUTPUT子句來執行此操作。下面是一個示例:

CREATE TABLE #temp (id [int] IDENTITY (1, 1) PRIMARY KEY CLUSTERED, Val int) 

CREATE TABLE #new (id [int], val int) 

INSERT INTO #temp (val) OUTPUT inserted.id, inserted.val INTO #new VALUES (5), (6), (7) 

SELECT id, val FROM #new 

DROP TABLE #new 
DROP TABLE #temp 

返回的結果集包括插入的IDENTITY值。

+0

這看起來很有趣。我可以使用OUTPUT子句以插入的順序可靠地獲取插入的ID嗎?我真的想插入一個大的數據表,並以正確的順序返回ID號碼,而不必重新傳輸整個數據包。 –

+1

@Ted它是一個集合,爲什麼命令很重要?輸出子句中的ID值將與在初始插入中分配給該值的值相關聯。一張表是一組無序的行,所以不要在訂單中掛得太緊 - 重要的是,如果StateA在插入期間獲得了200的標識值,則第二個表200中的標識值將與正確的行相關聯。它不會基於「訂單」來做到這一點。 –

+0

我正在寫一個C#程序,它使用表參數插入插入幾百萬行。是否有可能爲每一行取回正確的標識值並將它們可靠地分配給我的C#對象?我知道我可以簡單地檢索scope_identity()值並將每行的ID分配爲'(ending_identity_value - (number_of_rows_inserted - row_number))'。但是我擔心我可能太聰明瞭,我的代碼在所有情況下都不可靠,所以大多數情況下我只是設計程序,以便插入後不需要身份證號碼。 –

相關問題