使用存储过程设置参数值

时间:2017-10-17 13:09:58

标签: sql sql-server stored-procedures

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

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

以下是两个存储过程:

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分钟内自己搜索这个问题,但无济于事:)

编辑:我现在正在尝试使用OUTPUT变量,但是我仍然从第二个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

2 个答案:

答案 0 :(得分: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中尝试这样吗?

答案 1 :(得分: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