Πρέπει να γράψω μια αποθηκευμένη διαδικασία 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.
Αυτό είναι κάτι που χρειάστηκε να κάνω πρόσφατα:
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
Μπορείτε να χρησιμοποιήσετε τη Λειτουργικότητα Συγχώνευση για να επιτύχετε. Διαφορετικά, μπορείτε να το κάνετε:
declare @rowCount int
select @rowCount=@@RowCount
if @rowCount=0
begin
--insert....