2013-03-07 46 views
1

从存储过程返回值我有一个存储过程与两个插入语句。我想从第一张插页中返回ID。它看起来大致是这样的:(。在这种情况下,ID 6从myTable,一些奇怪的原因)使用scope_identity()

declare @retVal int 
Begin transaction 

insert into myTable(..) values (..) 

set @retVal = scope_identity() 

insert into myTable2(..) values(..) 

Commit transaction 

return @retVal 

当我这样做,插入语句工作正常,但相同的值返回每次

有人会猜测发生了什么吗?

+0

它将有助于查看完整的模式设置,包括表创建和完整tsql。你发布的内容没有错,但我怀疑你的实际代码更复杂? – 2013-03-07 18:46:13

+0

不要使用return(http://msdn.microsoft.com/library/ms174998(v=sql.105).aspx) 我建议你用* SELECT *替换* RETURN *,它应该可以工作 – jazzytomato 2013-03-07 18:48:54

+2

或者使用输出参数... – canon 2013-03-07 18:49:16

回答

6

请使用OUTPUT参数。 RETURN用于返回状态/错误代码,而不是数据。例如,RETURN只能处理INT。猜猜当您更改表格使用BIGINT时会发生什么情况,因为INT还不够?

ALTER PROCEDURE dbo.YourProcedure 
    @params VARCHAR(32), 
    @Table1ID INT = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRANSACTION; 

    INSERT dbo.Table1... 
    SET @Table1ID = SCOPE_IDENTITY(); 
    INSERT dbo.Table2... 

    COMMIT TRANSACTION; 
END 
GO 
+0

使用输出参数诀窍,非常感谢大家。我很高兴从这里开始走这条路。 – larryq 2013-03-07 22:26:16

+0

它返回@ Table1ID值和RETURN值...如何仅抑制Table1ID? – Bhat 2017-01-21 12:22:05

+0

对不起@bhat,我不明白这个问题。也许你应该创建一个新的问题。 – 2017-01-21 14:31:26