Eu preciso escrever um procedimento de armazenamento de T-SQL que atualiza uma linha em uma tabela. Se a linha não't existir, insira-a. Todos estes passos são envolvidos por uma transação.
Isto é para um sistema de reservas, por isso deve ser **atómico e fiável***. Deve retornar verdadeiro se a transação foi comprometida e o vôo foi reservado.
I'm novo para T-SQL, e não tenho certeza de como utilizar @@rowcount
. Isto é o que I'tenho escrito até agora. Estou no caminho certo? I'certamente é um problema fácil para você.
-- 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?)
Assumo uma única fila para cada voo? Se sim:
IF EXISTS (SELECT * FROM Bookings WHERE FLightID = @Id)
BEGIN
--UPDATE HERE
END
ELSE
BEGIN
-- INSERT HERE
END
Presumo que o que eu disse, como a sua maneira de fazer as coisas pode sobre-reservar um voo, pois irá inserir uma nova fila quando houver no máximo 10 bilhetes e você estiver reservando 20.
Isto é algo que eu tive de fazer 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