2012-02-09 15 views
2

我讀到使用OUTPUT子句可能是檢索新插入的記錄的身份的最佳方法。我很確定我可以編寫一個存儲過程並調用它,但是我的業務對象使用動態生成的SQL,所以不得不使用存儲過程會產生問題。任何人都可以告訴我如何使用ado.net使用output子句執行單個輸入語句並獲取返回的標識值?看起來好像不可能這樣做,但我想我會問...使用ado.net獲取標識的OUTPUT子句的示例?

編輯:好吧,所以它比我想象的更容易...我想我必須輸出到一張桌子首先變量。但是現在我做這件事的方式並不完全正確,因爲它在插入新記錄之前正在返回標識。這裏我只是用測試語句:

INSERT Test (F1) 
OUTPUT SCOPE_IDENTITY() 
VALUES ('Testing') 

每次我這樣做,它給我回結果產生一個數比最後插入記錄的價值認同實際上是較低的。我只需要在結果中加1,但當我在表格之間移動時,這不起作用,而最後的結果來自不同的表格。

我想知道我是否應該使用IDENT_CURRENT('Test')並添加1,因爲它將作爲單個事務處理,我不應該擔心併發問題。

有關如何獲得正確結果的任何想法,但返回?

+0

你問的是如何返回@@ IDENTITY作爲存儲過程的輸出參數,假設有插入? – Candide 2012-02-09 08:04:25

+0

@Ingenu查看我的編輯 – 2012-02-09 08:18:57

回答

2

如果您的身份字段名稱爲標識,然後用這樣的:通過SCOPE_IDENTITY()返回

INSERT Test (F1) 
OUTPUT INSERTED.Id 
VALUES ('Testing') 

值將變更後的insert顯然OUTPUT完成

或者保持簡單:

INSERT Test (F1) 
VALUES ('Testing') 

SELECT SCOPE_IDENTITY() 

,你甚至不應該知道什麼是身份領域。

+0

謝謝,這就是我最終做的,雖然這是一個更多的工作,因爲我不一定知道這個名字是Id。不幸的是,我認爲我不會有任何問題通過ReturnValue SqlParameter獲取值,但我仍然沒有得到那個工作... – 2012-02-09 09:04:53

+0

已更新的答案。 – 2012-02-09 09:08:21

+0

是的,我也試圖避免第二種方法讓我的代碼儘可能簡單(否則我將不得不將它包裝在事務中以確保沒有併發問題)。但是無論如何,我最終做了能夠使用INSERTED的工作,並且我意識到我可以使用ExecuteScalar()來獲取值。一切都很好,在世界上再次:) – 2012-02-09 09:14:05