2013-04-21 55 views
0

我創建一個存儲過程創建一個新的客戶,以便例如,存儲過程 - 知道下一個ID

CREATE PROCEDURE Customer_Create 
@customer_arg 
@type_arg 
AS 
BEGIN 
INSERT INTO Customer (Customer_id, Type_id) 
VALUES (@Customer_arg,@type_arg) 
End; 

如果我有我的說法有好幾個外鍵,他們都ID的是有辦法對於我來說,當我運行執行語句時,自動取得下一個ID號碼,而不必知道它會在我的腦海中脫穎而出?我想剛剛已經拉它的事實,ID爲2,因爲之前的紀錄是1

EXECUTE Customer_Create 16,2 

有什麼事情wnith output?如果是這樣如何工作代碼明智

+0

是否使用[ IDENTITY](http://msdn.microsoft.com/en-us/library/ms186775.aspx)在你的ID?如果不是,那就是你的問題。您應該允許數據庫生成新值。正如答案所解釋的那樣,'Scope_Identity()'可以在這種簡單情況下返回新分配的標識值,但oyu應該瞭解'OUTPUT'子句,因爲它更有用。值得注意的是,分配的值可能並不密集。例如,如果在事務處理期間插入幾行,並且事務被回滾,那麼id值將不會被重用。 – HABO 2013-04-22 00:37:59

回答

1

我懷疑你想要做的是返回記錄插入後的新ID。對於:

CREATE PROCEDURE Customer_Create (
    @customer_arg, 
    @type_arg, 
    @NewCustomerId int output 
) AS 
BEGIN 
    INSERT INTO Customer(Customer_id, Type_id) 
     VALUES (@Customer_arg, @type_arg); 

    @NewCustomerId = scope_identity(); 
End; 

還有其他幾種選擇得到認同,這解釋here

+0

'scope_identity()'可以 - 在極少數情況下 - 返回錯誤的值。您應該只使用OUTPUT子句來獲取最後一個IDENTITY值。 (請參閱我的答案,以獲取更多詳細信息。) – 2013-04-22 00:09:46

1

要到最後插入IDENTITY值,你應該使用OUTPUT條款是這樣的:

DECLARE @IdentValues TABLE(v INT); 

INSERT INTO dbo.IdentityTest 
OUTPUT INSERTED.id INTO @IdentValues(v) 
DEFAULT VALUES; 

SELECT v AS IdentityValues FROM @IdentValues; 

有喜歡@@IDENTITY其他一些機制,但它們都有顯著的問題。詳情請參閱我的Identity Crisis文章。

+0

我對這個東西很陌生...我仍然不太明白你的意思...如果我想'輸出'我做'OUTPUT INSERTED.Type_ID' ?它如何回調這些表以檢索上一個值,並添加到下一個值? – user168403 2013-04-22 00:27:26

+0

你有一秒實時聊天嗎? – user168403 2013-04-22 00:28:15

0
+0

'@@ Identity'殺死小貓。無論觸發器如何,「Scope_Identity()」和「OUTPUT」更有可能返回所需的值。 – HABO 2013-04-23 17:25:05

相關問題