2009-04-08 47 views
5

比方說,我有這個存儲過程在它的身上:T-SQL EXEC和範圍

EXEC 'INSERT INTO ' + quotename(@table) ' blah...' 
SELECT IDENT_CURRENT('' + @table + '') 

是IDENT_CURRENT()保證取得該行的EXEC插入的身份? IDENT_CURRENT()「返回爲任何會話和任何作用域中的特定表生成的最後一個標識值」,但是EXEC中的作用域與存儲過程不同,對嗎?

我想確保如果一次調用多個存儲過程,則會選擇正確的標識。

編輯:或者,我需要做的這兩個INSERT和EXEC內選擇,就像這樣:

declare @insert nvarchar 
set @insert = 
    'INSERT INTO ' + quotename(@table) ' blah...' + 
    'SELECT IDENT_CURRENT(''' + @table + ''')' 
EXEC @insert 

如果是這樣的話,我該如何選擇了EXEC的結果,如果我想在T-SQL中繼續使用更多的代碼?這樣的(儘管這顯然是不正確):

declare @insert nvarchar 
set @insert = 
    'INSERT INTO ' + quotename(@table) ' blah...' + 
    'SELECT IDENT_CURRENT(''' + @table + ''')' 

declare @ident int 
set @ident = EXEC @insert 

-- more code 
SELECT * FROM blah 

UPDATE:在第一個片段,如果我選擇SCOPE_IDENTITY()而不是使用IDENT_CURRENT(),NULL由SELECT返回。 :(

回答

6

嘗試

EXEC 'INSERT INTO ' + quotename(@table) ' blah...; SELECT @@IDENTITY' 

或更好,根據this

EXEC 'INSERT INTO ' + quotename(@table) ' blah...; SELECT SCOPE_IDENTITY()' 
+0

強烈建議您使用第二個。 @@身份幾乎從不使用,因爲它通常不會給出正確的結果。 用於識別需要位於exec語句中的範圍標識的榮譽。 – HLGEM 2009-04-08 21:23:44

1

我認爲SCOPE_IDENTITY()是你在找什麼,它會給你最近的識別當前範圍

4

根據微軟的T-SQL文檔:

IDENT_CURRENT與SQL Server 2000標識函數 SCOPE_IDENTITY和@@ IDENTITY類似。全部 三個函數返回最後生成的 標識值。然而,範圍 和會話在其最後在每個這些功能定義 不同:

IDENT_CURRENT返回在任何會話 特定的表和任何 範圍生成的最後 標識值。

@@ IDENTITY在所有範圍內返回當前會話中爲任何表格生成的最後一個標識 值。

SCOPE_IDENTITY返回在當前會話和當前 範圍內爲任何表 生成的最後一個 身份值。

所以,我要說,不,不IDENT_CURRENT不保證給你回到正確的值。它可能是在不同會話中插入的最後一個IDENTITY值。

我會確保使用SCOPE_IDENTITY代替 - 應該可靠地工作。

馬克

0

我想通過使用OUTPUT關鍵字來打開我最喜歡的解決方案。由於INSERT一次可以支持多行,因此我們希望知道插入的身份。這裏有:


-- source table 
if object_id('Source') is not null drop table Source 
create table Source 
(
    Value datetime 
) 
-- populate source 
insert Source select getdate() 
waitfor delay '00:00.1' 
insert Source select getdate() 
waitfor delay '00:00.1' 
insert Source select getdate() 
select * from Source -- test 
-- destination table 
if object_id('Destination') is null 
create table Destination 
(
    Id int identity(1, 1), 
    Value datetime 
) 
-- tracking table to keep all generated Id by insertion of table Destination 
if object_id('tempdb..#Track') is null 
create table #Track 
(
    Id int 
) 
else delete #Track 
-- copy source into destination, track the Id using OUTPUT 
insert Destination output inserted.Id into #Track select Value from Source 
select Id from #Track -- list out all generated Ids 

繼續運行這個多次,以感受它是如何工作的。