Comprobar si existe una fila, en caso contrario insertar

Necesito escribir un procedimiento almacenado T-SQL que actualice una fila en una tabla. Si la fila no existe, la inserte. Todos estos pasos envueltos por una transacción.

Esto es para un sistema de reservas, por lo que debe ser atómico y fiable. Debe devolver true si la transacción fue confirmada y el vuelo reservado.

Soy nuevo en T-SQL, y no estoy seguro de cómo utilizar @@rowcount. Esto es lo que he escrito hasta ahora. ¿Estoy en el camino correcto? Estoy seguro de que es un problema fácil para usted.

-- 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?)

¿Supongo que una sola fila para cada vuelo? Si es así:

IF EXISTS (SELECT * FROM Bookings WHERE FLightID = @Id)
BEGIN
    --UPDATE HERE
END
ELSE
BEGIN
   -- INSERT HERE
END

Asumo lo que he dicho, ya que tu forma de hacer las cosas puede sobrevender un vuelo, ya que insertará una nueva fila cuando haya 10 billetes como máximo y estés reservando 20.

Comentarios (7)

Esto es algo que he tenido que hacer recientemente:

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
Comentarios (1)

Podrías utilizar la funcionalidad Merge para conseguirlo. Si no, puede hacerlo:

declare @rowCount int

select @rowCount=@@RowCount

if @rowCount=0
begin
--insert....
Comentarios (2)