Ho bisogno di scrivere una stored procedure T-SQL che aggiorna una riga in una tabella. Se la riga non esiste, la inserisce. Tutti questi passaggi avvolti da una transazione.
Questo è per un sistema di prenotazione, quindi deve essere atomico e affidabile. Deve restituire true se la transazione è stata impegnata e il volo prenotato.
Sono nuovo del T-SQL, e non sono sicuro di come usare il @@rowcount
. Questo è quello che ho scritto fino ad ora. Sono sulla strada giusta? Sono sicuro che è un problema facile per te.
-- BEGIN TRANSACTION (HOW TO DO?)
UPDATE Bookings
SET TicketsBooked = TicketsBooked + @TicketsToBook
WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)
-- Here I need to insert only if the row doesn't exists.
-- If the row exists but the condition TicketsMax is violated, I must not insert
-- the row and return FALSE
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Bookings ... (omitted)
END
-- END TRANSACTION (HOW TO DO?)
-- Return TRUE (How to do?)
Suppongo una singola riga per ogni volo? Se è così:
IF EXISTS (SELECT * FROM Bookings WHERE FLightID = @Id)
BEGIN
--UPDATE HERE
END
ELSE
BEGIN
-- INSERT HERE
END
Presumo quello che ho detto, poiché il tuo modo di fare le cose può sovraprenotare un volo, poiché inserirà una nuova riga quando ci sono 10 biglietti al massimo e tu ne stai prenotando 20.
Questa è una cosa che ho dovuto fare recentemente:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[cjso_UpdateCustomerLogin]
(
@CustomerID AS INT,
@UserName AS VARCHAR(25),
@Password AS BINARY(16)
)
AS
BEGIN
IF ISNULL((SELECT CustomerID FROM tblOnline_CustomerAccount WHERE CustomerID = @CustomerID), 0) = 0
BEGIN
INSERT INTO [tblOnline_CustomerAccount] (
[CustomerID],
[UserName],
[Password],
[LastLogin]
) VALUES (
/* CustomerID - int */ @CustomerID,
/* UserName - varchar(25) */ @UserName,
/* Password - binary(16) */ @Password,
/* LastLogin - datetime */ NULL )
END
ELSE
BEGIN
UPDATE [tblOnline_CustomerAccount]
SET UserName = @UserName,
Password = @Password
WHERE CustomerID = @CustomerID
END
END