2017-10-17 3 views
0

Ich habe versucht, eine gespeicherte Prozedur zu verwenden, die die Gesamtkosten eines Dienstes berechnet, um den Wert eines Parameters "cost" in einer separaten gespeicherten Prozedur festzulegen.Festlegen eines Parameterwerts mithilfe einer gespeicherten Prozedur

Die berechnete gespeicherte Prozedur funktioniert wie vorgesehen (gibt den richtigen Wert zurück, wenn ich sie ausführe) und die zweite gespeicherte Prozedur wird ohne Fehler ausgeführt, der Wert aus der ersten gespeicherten Prozedur wird jedoch nicht übernommen (0 wird zurückgegeben) in meinem Finaltisch).

Hier sind die beiden gespeicherten Prozeduren:

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 

Zweite gespeicherte Prozedur:

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 

ich keineswegs bin übermäßig mit SQL so jede Hilfe dankbar dank erfahren würde, ich habe habe versucht, dieses Problem selbst für die letzten 30 Minuten oder so ohne Erfolg zu suchen :)

EDIT: Ich versuche jetzt, ein OUT zu verwenden PUT Variable, aber ich bekomme immer noch 0 als meinen endgültigen Wert vom zweiten SP. Könnte jemand bitte darauf hinweisen, was ich hier falsch mache?

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

diese Frage Siehe https://stackoverflow.com/questions/1605242/how-to-set-the-result-of-exec- stored-procedure-to-a-variable –

+0

Sie müssen eine Rückgabe in der ersten gespeicherten Prozedur verwenden, so dass es einen skalaren Wert zurückgibt, der einer Variablen zugewiesen werden kann –

+1

Sie können INSERT INTO Tabelle EXEC verwenden ...; ODER RÜCKKEHR; ODER OUTPUT Parameter –

Antwort

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 

Können Sie versuchen, wie dies in calculateCost?

+0

Danke für die Antwort, ich habe es versucht, aber bekomme einen Fehler "Die mehrteilige Kennung" Vehicle.CoulmnName "konnte nicht gebunden werden.". –

0

In Ordnung, nachdem ich ein wenig herumgespielt habe, habe ich mein calculateCost SP außerhalb meines updateBooking SP richtig funktioniert. Ich habe einen Fehler "The multi-part identifier "Vehicle.CoulmnName" could not be bound." gefunden, den ich gelöst habe, indem ich AS Cost von der Abfrage entfernte. Ich benutze die folgende Abfrage zu debuggen:

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

, die den richtigen Wert gedruckt. Das updateBooking SP funktionierte jedoch immer noch nicht korrekt. Nachdem ich es nochmal durchgelesen hatte, stellte ich fest, dass ich @BookingID in calculateCost statt @VIN übergab, weshalb es nichts zurückgab. Hier der endgültige Code für beide gespeicherten Prozeduren, falls es irgendjemand in der Zukunft hilft.

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

Sieht gut aus :-) Habe gerade eine ähnliche Lösung fertiggestellt. Ich bevorzuge jedoch in den meisten Fällen Funktionen anstelle von SPs. :-D – Tyron78

+0

@ Tyron78 ​​Danke für den Tipp! Ich werde es definitiv für die zukünftige Verwendung prüfen. Ich wurde gebeten, eine gespeicherte Prozedur für dieses zu machen, also entschied ich mich, zu diesen Anforderungen zu bleiben :). –

Verwandte Themen