2017-10-17 35 views
0

我一直在试图使用存储过程来计算服务的总成本,以在单独的存储过程中设置“成本”参数的值。使用存储过程设置参数值

计算存储过程按预期工作(当我运行它时返回正确的值),并且第二个存储过程正在执行而没有错误,但第一个存储过程的值没有被结转(返回0在我的决赛桌上)。

这里有两个存储过程:

ALTER PROCEDURE [dbo].[calculateCost] 
    (@VIN INT, 
     @BookingDate DATE, @BookingTime TIME(7), 
     @ReturnDate DATE, @ReturnTime TIME(7) 
    ) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     (CASE WHEN (DATEDIFF(hour, @BookingTime, @ReturnTime) * Vehicle.HourlyRate) <= 0 
       THEN 0 
       ELSE (DATEDIFF(hour, @BookingTime, @ReturnTime) * Vehicle.HourlyRate) 
     END) + DATEDIFF(day, @BookingDate, @ReturnDate) * Vehicle.DailyRate AS Cost 
    FROM 
     dbo.Vehicle 
    WHERE 
     VIN = @VIN 
END 

第二个存储过程:

ALTER PROCEDURE [dbo].[updateBooking] 
    (@BookingID INT, @CustomerID INT, @VIN INT, 
     @BookingDate DATE, @BookingTime TIME(7), 
     @ReturnDate DATE, @ReturnTime TIME(7), 
     @OdoReadingInbound INT, 
     @Discount FLOAT, 
     @ObservationsIn NVARCHAR(50), 
     @EmpID INT 
    ) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @Cost money 

    EXEC @Cost = dbo.calculateCost @BookingID, @BookingDate, @BookingTime, @ReturnDate, @ReturnTime 

    UPDATE dbo.Booking 
    SET CustomerID = @CustomerID, 
     VIN = @VIN, 
     BookingDate = @BookingDate, 
     BookingTime = @BookingTime, 
     ReturnDate = @ReturnDate, 
     ReturnTime = @ReturnTime, 
     OdoReadingInbound = @OdoReadingInbound, 
     Discount = @Discount, 
     ObservationsIn = @ObservationsIn, 
     EmpID = @EmpID, 
     Cost = @Cost 
    WHERE BookingID = @BookingID 
END 

我绝不用SQL所以任何帮助,将不胜感激感谢过于经历,我已经试图寻找这个问题我自己在过去的30分钟左右无济于事:)

编辑:现在我试图使用OUT PUT变量,但是我仍然从第二个SP中获得0作为我的最终值。有人能指出我在这里做错了吗?

ALTER PROCEDURE [dbo].[calculateCost] 
    -- Add the parameters for the stored procedure here 
    (@VIN int 
    , @BookingDate date 
    , @BookingTime time(7) 
    , @ReturnDate date 
    , @ReturnTime time(7) 
    , @Cost money OUTPUT 
    ) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT (CASE WHEN 
      (DATEDIFF(hour, @BookingTime, @ReturnTime) 
      * Vehicle.HourlyRate) <= 0 THEN 0 ELSE 
      (DATEDIFF(hour, @BookingTime, @ReturnTime) 
      * Vehicle.HourlyRate) END) 
      + DATEDIFF(day, @BookingDate, @ReturnDate) 
      * Vehicle.DailyRate AS Cost 
    FROM dbo.Vehicle 
    WHERE VIN = @VIN 
    RETURN 
END 

ALTER PROCEDURE [dbo].[updateBooking] 
-- Add the parameters for the stored procedure here 
    (@BookingID int 
    , @CustomerID int 
    , @VIN int 
    , @BookingDate date 
    , @BookingTime time(7) 
    , @ReturnDate date 
    , @ReturnTime time(7) 
    , @OdoReadingInbound int 
    , @Discount float 
    , @ObservationsIn nvarchar(50) 
    , @EmpID int 
    ) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    DECLARE @Cost money 
    EXEC @Cost = dbo.calculateCost @BookingID, @BookingDate, @BookingTime, @ReturnDate, @ReturnTime, @Cost OUTPUT 
    UPDATE dbo.Booking 
    SET CustomerID = @CustomerID, 
     VIN = @VIN, 
     BookingDate = @BookingDate, 
     BookingTime = @BookingTime, 
     ReturnDate = @ReturnDate, 
     ReturnTime = @ReturnTime, 
     OdoReadingInbound = @OdoReadingInbound, 
     Discount = @Discount, 
     ObservationsIn = @ObservationsIn, 
     EmpID = @EmpID, 
     Cost = @Cost 
    WHERE BookingID = @BookingID 
END 
+0

看到这个问题https://stackoverflow.com/questions/1605242/how-to-set-the-result-of-exec-存储过程到变量 –

+0

您需要在第一个存储过程中使用返回值,以便它返回一个标量值,该值可以分配给变量 –

+1

,您可以使用INSERT INTO table EXEC ...; OR RETURN; OR OUTPUT参数 –

回答

0
SELECT @COST = CASE WHEN 
     (DATEDIFF(hour, @BookingTime, @ReturnTime) 
     * Vehicle.HourlyRate) <= 0 THEN 0 ELSE 
     (DATEDIFF(hour, @BookingTime, @ReturnTime) 
     * Vehicle.HourlyRate) END 
     + DATEDIFF(day, @BookingDate, @ReturnDate) 
     * Vehicle.DailyRate AS Cost 
FROM dbo.Vehicle 
WHERE VIN = @VIN 
RETURN 

你可以尝试这样的calculateCost?

+0

感谢您的回复,我试过这个,但得到一个错误“多部分标识符”Vehicle.CoulmnName“无法绑定”。 –

0

好吧,在摆弄了一会儿之后,我让我的calculateCost SP在我的updateBooking SP之外正常工作。我遇到了一个错误"The multi-part identifier "Vehicle.CoulmnName" could not be bound.",我通过从查询中删除AS Cost来解决这个问题。我用下面的查询来调试:

declare @Cost money 
exec dbo.calculateCost 7 
, '20170101' 
, '18:00:00' 
, '20170101' 
, '20:30:00' 
, @Cost output 
print @Cost 

哪打印出正确的值。但是,updateBooking SP仍然无法正常工作。再次阅读后,我意识到我正在将@BookingID转换为calculateCost而不是@VIN,这就是为什么它没有返回任何东西。这里是两个存储过程的最终代码,以防将来帮助任何人。

calculateCost:

ALTER PROCEDURE [dbo].[calculateCost] 
    -- Add the parameters for the stored procedure here 
    (@VIN int 
    , @BookingDate date 
    , @BookingTime time(7) 
    , @ReturnDate date 
    , @ReturnTime time(7) 
    , @Cost money OUTPUT 
    ) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT @Cost = (CASE WHEN 
      (DATEDIFF(hour, @BookingTime, @ReturnTime) 
      * Vehicle.HourlyRate) <= 0 THEN 0 ELSE 
      (DATEDIFF(hour, @BookingTime, @ReturnTime) 
      * Vehicle.HourlyRate) END) 
      + DATEDIFF(day, @BookingDate, @ReturnDate) 
      * Vehicle.DailyRate 
    FROM dbo.Vehicle 
    WHERE VIN = @VIN 
    RETURN 
END 

updateBooking:

ALTER PROCEDURE [dbo].[updateBooking] 
    -- Add the parameters for the stored procedure here 
    (@BookingID int 
    , @CustomerID int 
    , @VIN int 
    , @BookingDate date 
    , @BookingTime time(7) 
    , @ReturnDate date 
    , @ReturnTime time(7) 
    , @OdoReadingInbound int 
    , @Discount float 
    , @ObservationsIn nvarchar(50) 
    , @EmpID int 
    ) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    DECLARE @Cost money 
    EXEC dbo.calculateCost @VIN, @BookingDate, @BookingTime, @ReturnDate, @ReturnTime, @Cost OUTPUT 
    UPDATE dbo.Booking 
    SET CustomerID = @CustomerID, 
     VIN = @VIN, 
     BookingDate = @BookingDate, 
     BookingTime = @BookingTime, 
     ReturnDate = @ReturnDate, 
     ReturnTime = @ReturnTime, 
     OdoReadingInbound = @OdoReadingInbound, 
     Discount = @Discount, 
     ObservationsIn = @ObservationsIn, 
     EmpID = @EmpID, 
     Cost = @Cost 
    WHERE BookingID = @BookingID 
END 
+0

看起来不错:-)刚刚完成了一个类似的解决方案。但是,在大多数情况下,我更喜欢功能而不是SP。 :-D – Tyron78

+0

@ Tyron78谢谢你的提示!我一定会考虑它以备将来使用。我被要求为此做一个存储过程,所以我决定坚持这些要求:)。 –