我有一个存储过程如下:
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
不返回任何内容。第二个输出参数的目的是检索刚刚插入数据库的列。
答案 0 :(得分: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
答案 1 :(得分:13)
在您的第一个RETURN“无条件退出查询或过程”后,程序执行结束。
RETURN @order_ID
相反,请考虑将两个值作为一个记录集返回
SELECT @order_ID AS OrderID, @orderReferenceOutput AS OrderReference
在程序结束时。
答案 2 :(得分:3)
从原始存储过程中删除RETURN
。
将您的通话指令调整为
DECLARE @Id INT
DECLARE @Reference VARCHAR(50)
EXEC [dbo].[sp_web_orders_insert], @order_ID = @Id OUTPUT,
@orderReferenceOutput = @Reference OUTPUT
@Id和@Reference可在您的通话过程中使用。
答案 3 :(得分:2)
答案 4 :(得分:1)
可以返回多个输出参数,但据我所知只有Microsoft SQL Server JDBC驱动程序。
答案 5 :(得分:-1)
您必须在exec
语句的每个输出的末尾放置输出,否则您获得的所有内容都为null。您可以进行简单的测试来验证这一点:
if(@order_ID is null)
Print '@order_ID is null'
else
Print '@order_ID is not null'