我有一个存储过程 sp_OrderPrice_Calc
那得花点时间 OrderNumber
返回一个标量值 Order Price
. 我尝试在不使用光标的情况下循环上述存储过程以获得订单号列表。
我有下面的逻辑,但输出不是预期的。如有任何建议/更改,我将不胜感激。
---------------------------------------------------------------------------------
DECLARE @orderInfo AS TABLE
(
ID INT IDENTITY(1,1),
CompanyName VARCHAR(40),
OrderNumber VARCHAR(40),
DeliveryType VARCHAR(40),
OrderPrice DECIMAL(6,1)
)
INSERT INTO @orderInfo (CompanyName, OrderNumber, DeliveryType)
SELECT CompanyName, OrderNumber, DeliveryType
FROM OrderData
DECLARE @ID INT = 1, @OrderNumber VARCHAR(40), @OrderPrice DECIMAL(6,1)
WHILE @ID IS NOT NULL
BEGIN
SELECT @OrderNumber = OrderNumber
FROM @orderInfo
WHERE ID = @ID
INSERT INTO @orderInfo (OrderPrice)
EXEC sp_OrderPrice_Calc @Order_Number = @OrderNumber, @Order_Price = @OrderPrice
SELECT @ID = MIN(ID)
FROM @OrderInfo
WHERE ID > @ID;
END
SELECT * FROM @OrderInfo
---------------------------------------------------------------------------------
注意:我已经创建了它应该使用的存储过程 @Order_Number
作为输入和 @order_Price
作为输出,我在上面的逻辑中使用
例如
CREATE PROCEDURE [dbo].[spCDS_TP_TW_limit]
@Order_Number VARCHAR(50) = '',
@order_Price decimal(6,1) OUTPUT
AS
上面的逻辑为输出中的每个订单号记录返回“null”
CompanyName OrderNumber DeliveryType OrderPrice
--------------------------------------------------
ABBCCC 123456 Standard NULL
DDDDEE 147852 Standard NULL
EEEFFF 159635 Priority NULL
FFFFGG 163589 Ground NULL
1条答案
按热度按时间nuypyhwy1#
你有一些误解。
首先,在使用表单时,您需要了解这一点
insert into table (columns...) exec procedure
,插入的是存储过程的结果集。换言之,无论从过程中的select语句中得到什么。如果存储过程没有结果集,则没有要插入的内容。请注意,输出参数与结果集不同。观察如果运行以下批处理会发生什么:在这个脚本的执行结束时,表
t
将有一个值为“”this is the result set“”的单行。价值@param
变量将是“this is the output parameter”。好的,现在让我们看看你的手术过程。
你使用
insert ... exec
模式,因此存储过程的结果集将作为新行插入到@orderInfo
table。但从你所写的,似乎你打算提供的价格作为一个整体
output
要由用户使用的参数值@orderPrice
变量。它实际上不会这样做,因为您没有将它用作输出参数。你把电话忘了output
关键字。我希望您的存储过程根本没有结果集。也就是说没有东西被插入到表中。
即使存储过程确实返回了结果集,您也在执行
insert
. 一insert
将创建新行,但不会更新OrderPrice
现有行的列。你可能打算这样做:
这里可能有更好的解决方案。如果存储过程可以重写为用户定义的函数,则根本不需要循环: