Controleer of er een rij bestaat, anders invoegen

Ik moet een T-SQL stored procedure schrijven die een rij in een tabel update. Als de rij niet bestaat, voeg hem dan in. Al deze stappen omwikkeld door een transactie.

Dit is voor een boekingssysteem, dus het moet atomisch en betrouwbaar zijn. Het moet true teruggeven als de transactie is vastgelegd en de vlucht is geboekt.

Ik ben nieuw in T-SQL, en niet zeker over hoe @@rowcount te gebruiken. Dit is wat ik'heb geschreven tot nu toe. Ben ik op de goede weg? Ik weet zeker dat dit een makkelijk probleem voor je is.

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

Ik neem aan een enkele rij voor elke vlucht? Zo ja:

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

Ik neem aan wat ik zei, omdat uw manier van doen een vlucht kan overboeken, omdat het een nieuwe rij zal invoegen wanneer er maximaal 10 tickets zijn en u er 20 boekt.

Commentaren (7)

Dit is iets wat ik pas nog heb moeten doen:

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

Je zou de Merge Functionaliteit kunnen gebruiken om dit te bereiken. Anders kunt u doen:

declare @rowCount int

select @rowCount=@@RowCount

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