Prüfen, ob eine Zeile existiert, sonst einfügen

Ich brauche eine T-SQL gespeicherte Prozedur zu schreiben, die eine Zeile in einer Tabelle aktualisiert. Wenn die Zeile nicht vorhanden ist, fügen Sie sie ein. Alle diese Schritte werden von einer Transaktion umschlossen.

Dies ist für ein Buchungssystem, also muss es atomar und zuverlässig sein. Sie muss true zurückgeben, wenn die Transaktion abgeschlossen und der Flug gebucht wurde.

Ich bin Neu in T-SQL und nicht sicher, wie ich @@rowcount verwenden soll. Dies ist, was ich bis jetzt geschrieben habe. Bin ich auf dem richtigen Weg? Ich bin sicher, das ist ein einfaches Problem für Sie.

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

Ich nehme an, eine einzelne Zeile für jeden Flug? Wenn ja:

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

Ich gehe davon aus, dass Ihre Vorgehensweise zu einer Überbuchung von Flügen führen kann, da eine neue Zeile eingefügt wird, wenn es maximal 10 Tickets gibt und Sie 20 buchen.

Kommentare (7)

Das ist etwas, was ich erst kürzlich tun musste:

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

Sie können die Merge-Funktionalität verwenden, um dies zu erreichen. Andernfalls können Sie tun:

declare @rowCount int

select @rowCount=@@RowCount

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