2013-04-21 57 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

相关问题