我一直在尝试使用存储过程来计算服务的总成本,以便在单独的存储过程中设置“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
答案 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