Preverite, ali vrstica obstaja, v nasprotnem primeru vstavite

Napisati moram shranjeno proceduro T-SQL, ki posodobi vrstico v tabeli. Če vrstica ne obstaja, jo vstavi. Vse te korake zavije transakcija.

To je namenjeno sistemu rezervacij, zato mora biti atomsko in zanesljivo. Vrniti mora true, če je bila transakcija izvedena in let rezerviran.

Sem novinec v jeziku T-SQL in nisem prepričan, kako uporabiti @@@rowcount. To je tisto, kar sem napisal do zdaj. Ali sem na pravi poti? Prepričan sem, da je to za vas lahek problem.

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

Predvidevam, da je za vsak let ena vrstica? Če je tako:

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

Predvidevam, da je tako, kot sem rekel, saj lahko vaš način dela povzroči preveliko rezervacijo leta, ker vstavi novo vrstico, če je na voljo največ 10 vozovnic, vi pa jih rezervirate 20.

Komentarji (7)

To sem moral storiti pred kratkim:

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

Uporabite lahko funkcijo Združitev, da dosežete. V nasprotnem primeru lahko naredite:

declare @rowCount int

select @rowCount=@@RowCount

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