Проверете дали съществува ред, в противен случай вмъкнете

Трябва да напиша процедура на 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)

Можете да използвате функцията Merge, за да постигнете. В противен случай можете да направите:

declare @rowCount int

select @rowCount=@@RowCount

if @rowCount=0
begin
--insert....
Коментари (2)