2011-08-09 47 views
6

我有一个存储过程如下:SQL Server 2008中存储过程与多个输出参数

ALTER PROCEDURE [dbo].[sp_web_orders_insert] 
(
    @userId int = default, 
    @custId int = default, 
    @orderDate datetime = default, 
    @orderTotal money = default, 
    @statusId int = default, 
    @orderReference varchar(50) = default, 
    @custReference varchar(50) = default, 
    @order_ID INT output, 
    @orderReferenceOutput varchar(50) output 
) 
AS 


    SET NOCOUNT OFF; 
    INSERT INTO [web_orders] ([user_ID], [cust_ID], [orderDate], [orderTotal], [statusId], [orderReference], [custReference]) VALUES (@userId, @custId, @orderDate, @orderTotal, @statusId , 'PLC' + REPLICATE('0', (7 - LEN((select MAX(order_ID) from web_orders)))) + CAST((select(max(order_ID)+1) from web_orders) AS VARCHAR(5)), @custReference); 

    SELECT @order_ID = @@IDENTITY 
    RETURN @order_ID 

    SELECT @orderReferenceOutput = 'PLC' + REPLICATE('0', (7 - LEN((select MAX(order_ID) from web_orders)))) + CAST((select(max(order_ID)+1) from web_orders) AS VARCHAR(5)) 
    RETURN @orderReferenceOutput 

出于某种原因,第二个输出参数@orderReferenceOutput回报什么。这第二个输出参数的目的是检索我刚刚插入数据库的列。

+3

最简单的修复:只是注释掉你的RETURN命令。这不是他们想要的。 –

回答

12

过程执行在第一个RETURN之后结束,其中“无条件退出查询或过程”。

RETURN @order_ID 

相反,考虑在程序结束与

SELECT @order_ID AS OrderID, @orderReferenceOutput AS OrderReference 

返回两个值作为一个记录。

+0

多数民众赞成在此将接受答案,当它允许我 – StevieB

+4

@Joe,他已经有输出参数,为什么不使用这些,而不是增加记录集的开销? –

2

在存储过程中只能有一个返回。作为soo nas,它退出proc的第一个回报。

在发出RETURN之前,使用SET操作为变量赋值。

Microsoft Article on Return

13

您有多个输出参数,你应该使用它们。返回值是针对错误/状态代码,而不是数据。

ALTER PROCEDURE [dbo].[sp_web_orders_insert] 
    @userId ..., 
    @order_ID INT OUTPUT, 
    @orderReferenceOutput VARCHAR(50) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT OFF; -- WHY????????? 

    INSERT INTO [web_orders] (user_ID, ...) SELECT @userId, ...; 

    SELECT @order_ID = SCOPE_IDENTITY(); -- preferred over @@IDENTITY; 

    -- using @order_ID here instead of SELECT MAX() twice: 

    SELECT @orderReferenceOutput = 'PLC' 
     + REPLICATE('0', (7 - LEN((@order_ID+1)))) 
     + CAST((@order_ID+1) AS VARCHAR(5)) -- (5)? This breaks when you hit order #100,000 

    RETURN; -- do not RETURN any data - it's already in your OUTPUT parameters! 
END 
GO 
3

删除您RETURN从原来的存储过程。

调整你的呼叫指令看起来像

DECLARE @Id INT 
DECLARE @Reference VARCHAR(50) 

EXEC [dbo].[sp_web_orders_insert], @order_ID = @Id OUTPUT, 
    @orderReferenceOutput = @Reference OUTPUT 

@Id和@Reference在您调用进程可用。

-1

您必须将输出结果放在exec语句的每个输出结尾处,否则所有输出都为空。你可以做一个简单的测试来验证这一点:

if(@order_ID is null) 
Print '@order_ID is null' 
else 
Print '@order_ID is not null' 
+0

我认为这不回答OP问题。 – matsjoyce