使用存储过程设置参数值
我一直在试图使用存储过程来计算服务的总成本,以在单独的存储过程中设置“成本”参数的值。使用存储过程设置参数值
计算存储过程按预期工作(当我运行它时返回正确的值),并且第二个存储过程正在执行而没有错误,但第一个存储过程的值没有被结转(返回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
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?
感谢您的回复,我试过这个,但得到一个错误“多部分标识符”Vehicle.CoulmnName“无法绑定”。 –
好吧,在摆弄了一会儿之后,我让我的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
看起来不错:-)刚刚完成了一个类似的解决方案。但是,在大多数情况下,我更喜欢功能而不是SP。 :-D – Tyron78
@ Tyron78谢谢你的提示!我一定会考虑它以备将来使用。我被要求为此做一个存储过程,所以我决定坚持这些要求:)。 –
看到这个问题https://stackoverflow.com/questions/1605242/how-to-set-the-result-of-exec-存储过程到变量 –
您需要在第一个存储过程中使用返回值,以便它返回一个标量值,该值可以分配给变量 –
,您可以使用INSERT INTO table EXEC ...; OR RETURN; OR OUTPUT参数 –