具有多个输出参数的SQL Server 2008存储过程

Ste*_*ieB 6 sql-server 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 
Run Code Online (Sandbox Code Playgroud)

由于某种原因,第二个输出参数@orderReferenceOutput什么都不返回 第二个输出参数的目的是检索刚刚插入数据库的列.

Aar*_*and 15

您有多个输出参数,您应该使用它们.RETURN值用于错误/状态代码,而不是数据.

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
Run Code Online (Sandbox Code Playgroud)


Joe*_*lli 14

在第一次RETURN "无条件退出查询或过程" 后,过程执行结束.

RETURN @order_ID
Run Code Online (Sandbox Code Playgroud)

相反,请考虑将两个值作为一个记录集返回

SELECT @order_ID AS OrderID, @orderReferenceOutput AS OrderReference
Run Code Online (Sandbox Code Playgroud)

在程序结束时.

  • @Joe,他已经有输出参数,为什么不使用那些而不是添加记录集的开销? (5认同)