Ελέγξτε αν υπάρχει γραμμή, αλλιώς εισάγετε

Πρέπει να γράψω μια αποθηκευμένη διαδικασία T-SQL που ενημερώνει μια γραμμή σε έναν πίνακα. Εάν η γραμμή δεν υπάρχει, την εισάγει. Όλα αυτά τα βήματα τυλίγονται από μια συναλλαγή.

Πρόκειται για ένα σύστημα κρατήσεων, οπότε πρέπει να είναι ατομικό και αξιόπιστο. Πρέπει να επιστρέφει true αν η συναλλαγή έχει δεσμευτεί και η πτήση έχει κρατηθεί.

Είμαι νέος στην T-SQL, και δεν είμαι σίγουρος για το πώς να χρησιμοποιήσω το @@rowcount. Αυτό έχω γράψει μέχρι τώρα. Βρίσκομαι στο σωστό δρόμο; Είμαι σίγουρος ότι είναι ένα εύκολο πρόβλημα για εσάς.

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

Υποθέτω ότι υπάρχει μία μόνο σειρά για κάθε πτήση; Αν ναι:

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

Υποθέτω αυτό που είπα, καθώς ο τρόπος που κάνετε τα πράγματα μπορεί να υπερκρατήσει μια πτήση, καθώς θα εισάγει μια νέα σειρά όταν υπάρχουν 10 εισιτήρια το πολύ και εσείς κάνετε κράτηση 20.

Σχόλια (7)

Αυτό είναι κάτι που χρειάστηκε να κάνω πρόσφατα:

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
Σχόλια (1)

Μπορείτε να χρησιμοποιήσετε τη Λειτουργικότητα Συγχώνευση για να επιτύχετε. Διαφορετικά, μπορείτε να το κάνετε:

declare @rowCount int

select @rowCount=@@RowCount

if @rowCount=0
begin
--insert....
Σχόλια (2)