Kontroller, om der findes en række, ellers indsæt

Jeg skal skrive en T-SQL-lagret procedure, der opdaterer en række i en tabel. Hvis rækken ikke findes, indsættes den. Alle disse trin indpakket af en transaktion.

Dette er til et bookingsystem, så det skal være atomisk og pålideligt. Den skal returnere true, hvis transaktionen er blevet bekræftet, og flyrejsen er booket.

Jeg er ny til T-SQL, og er ikke sikker på hvordan jeg skal bruge @@@rowcount. Dette er hvad jeg har skrevet indtil nu. Er jeg på den rigtige vej? I'm sikker på er et nemt problem for dig.

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

Jeg går ud fra, at der er en enkelt række for hver flyvning? I så fald:

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

Jeg går ud fra det, jeg sagde, da din måde at gøre tingene på kan overbooke et fly, da den indsætter en ny række, når der er max. 10 billetter, og du booker 20.

Kommentarer (7)

Det er noget, jeg har været nødt til at gøre for nylig:

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

Du kan bruge Sammenlægning funktionaliteten til at opnå. Ellers kan du gøre det:

declare @rowCount int

select @rowCount=@@RowCount

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