Vérifier si une ligne existe, sinon insérer

Je dois écrire une procédure stockée T-SQL qui met à jour une ligne dans une table. Si la ligne n'existe pas, l'insérer. Toutes ces étapes sont enveloppées par une transaction.

Il s'agit d'un système de réservation, qui doit donc être atomique et fiable. Elle doit renvoyer true si la transaction a été validée et le vol réservé.

Je suis nouveau en T-SQL, et je ne sais pas comment utiliser @@rowcount. Voici ce que j'ai écrit jusqu'à présent. Suis-je sur la bonne voie ? Je suis sûr que c'est un problème facile pour vous.

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

Je suppose qu'une seule ligne pour chaque vol ? Si c'est le cas :

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

Je suppose ce que j'ai dit, car votre façon de faire peut surbooker un vol, car elle insère une nouvelle ligne alors qu'il y a 10 billets maximum et que vous en réservez 20.

Commentaires (7)

C'est quelque chose que j'ai dû faire récemment :

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

Vous pouvez utiliser la fonctionnalité [Merge][1] pour y parvenir. Sinon, vous pouvez le faire :

declare @rowCount int

select @rowCount=@@RowCount

if @rowCount=0
begin
--insert....

[1] : http://msdn.microsoft.com/en-us/library/bb510625.aspx

Commentaires (2)