sql—通过循环记录来执行存储过程并存储结果

qni6mghb  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(408)

我有一个存储过程 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
nuypyhwy

nuypyhwy1#

你有一些误解。
首先,在使用表单时,您需要了解这一点 insert into table (columns...) exec procedure ,插入的是存储过程的结果集。换言之,无论从过程中的select语句中得到什么。如果存储过程没有结果集,则没有要插入的内容。请注意,输出参数与结果集不同。观察如果运行以下批处理会发生什么:

create table t(result varchar(30))
go

create  procedure p (@result varchar(30) = null output) as 
begin 
    set @result = 'this is the output parameter';
    select 'this is the result set'; 
end
go

declare @param varchar(30);
insert t (result) exec p @param output;
select * from t; 
select @param;

在这个脚本的执行结束时,表 t 将有一个值为“”this is the result set“”的单行。价值 @param 变量将是“this is the output parameter”。
好的,现在让我们看看你的手术过程。
你使用 insert ... exec 模式,因此存储过程的结果集将作为新行插入到 @orderInfo table。
但从你所写的,似乎你打算提供的价格作为一个整体 output 要由用户使用的参数值 @orderPrice 变量。它实际上不会这样做,因为您没有将它用作输出参数。你把电话忘了 output 关键字。
我希望您的存储过程根本没有结果集。也就是说没有东西被插入到表中。
即使存储过程确实返回了结果集,您也在执行 insert . 一 insert 将创建新行,但不会更新 OrderPrice 现有行的列。
你可能打算这样做:

While @ID IS NOT NULL
 BEGIN
   Select @OrderNumber = OrderNumber;
   From @orderInfo Where ID = @ID;

   Exec sp_OrderPrice_Calc 
      @Order_Number = @OrderNumber, 
      @Order_Price  = @OrderPrice output; -- output keyword is required both here and in the procedure definition

   update @orderInfo set OrderPrice = @orderPrice where ID = @ID; -- update, not insert.

   Select @ID = MIN(ID) From @OrderInfo where ID > @ID;
 END

这里可能有更好的解决方案。如果存储过程可以重写为用户定义的函数,则根本不需要循环:

select CompanyName, OrderNumber, DeliveryType, OrderPrice = myOrderPriceFunction(...)
From OrderData;

相关问题