2009-06-10 75 views
11

我使用自動增量鍵字段插入到SQLServer表中。 (我相信這就是所謂的SQLServer的IDENTITY列。)如何從SQLServer SELECT語句返回新的IDENTITY列值?

在Oracle中,我可以使用返回的關鍵字給我的INSERT語句中的結果集就像一個SELECT查詢將返回生成的值:

INSERT INTO table 
(foreign_key1, value) 
VALUES 
(9, 'text') 
RETURNING key_field INTO :var; 

如何在SQLServer中完成此操作?

Bonus:好的,迄今爲止的答案很好,但是如果可能的話,我怎麼把它放到一個單獨的語句中呢? :)

+0

增加了「一個呼叫」的例子。 – gbn 2009-06-10 16:24:09

回答

17

一般來說,它不能在一個語句中完成。

但是,SELECT SCOPE_IDENTITY()可以(也應該)直接放在INSERT語句之後,因此它全部在相同的數據庫調用中完成。

例子:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();"); 

您可以使用輸出,但它有一定的侷限性,你應該知道的:

http://msdn.microsoft.com/en-us/library/ms177564.aspx

9
SELECT SCOPE_IDENTITY() 

編輯:有一齣戲......

如果只OUTPUT條款支持局部變量。

無論如何,獲得ID的範圍,而不是一個單

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50)) 

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol 
SELECT 'harry' 
UNION ALL 
SELECT 'dick' 
UNION ALL 
SELECT 'tom' 

編輯2:在一個呼叫。我從來沒有機會使用這種構造。

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50)) 

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol 
VALUES('foobar') 
+0

我第二個這個。 SCOPE_IDENTITY()返回最近查詢範圍內的最新標識。其他方法@@ IDENTITY和IDENT_CURRENT()不限於特定的範圍 – 2009-06-10 16:15:44

+0

hhmm one anonymous downvote for this answer ... – gbn 2009-06-10 16:21:08

2

SCOPE_IDENTITY

4

除了@@ IDENTITY,你也應該看看SCOPE_IDENTITY()和IDENT_CURRENT()。你很可能想要SCOPE_IDENTITY()。 @@ IDENTITY有一個問題,它可能會返回您試圖跟蹤的實際表上的觸發器中創建的標識值。

此外,這些是單值函數。我不知道Oracle RETURNING關鍵字是如何工作的。

0

您可以使用OUTPUT INTO,它具有能夠捕獲插入的多個身份的附加好處。

0

INSERT INTO表(foreign_key1,值)VALUES(9, 'text'); SELECT @@ IDENTITY;

2

這取決於你的調用上下文。

如果您從客戶端代碼調用此函數,則可以使用OUTPUT,然後讀取返回的值。

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20)) 

INSERT INTO @t (ColStr) 
OUTPUT Inserted.ColID 
VALUES ('Hello World') 

結果:

 ColID 
----------- 
      1 

如果你在存儲過程中包裝此,使用輸出更多的工作。在那裏,你會想使用SCOPE_IDENTITY(),但是你不能用一個語句來完成。當然,你可以用一個';'在一行中放置多個語句,分隔符,但這不是一個單一的聲明。

DECLARE @idValue int 
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20)) 

INSERT INTO @t (ColStr) VALUES ('Hello World') 

SELECT @idValue = SCOPE_IDENTITY() 

結果:@idValue變量包含標識值。使用OUTPUT參數返回值。