262 votes

Vérifier si une ligne existe, sinon insérer

Je dois écrire une procédure stockée T-SQL qui met à jour une ligne dans une table. Si la ligne n'existe pas, l'insérer. Toutes ces étapes sont enveloppées par une transaction.

Il s'agit d'un système de réservation, il doit donc être atomique et fiable . Il doit retourner vrai si la transaction a été validée et le vol réservé.

Je suis débutant en T-SQL et je ne sais pas comment utiliser @@rowcount . Voilà ce que j'ai écrit jusqu'à présent. Suis-je sur la bonne voie ? Je suis sûr que c'est un problème facile pour vous. Merci

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

1 votes

0 votes

1voto

JoshBerke Points 34238

Vous pourriez utiliser le Fusionner Fonctionnalité à atteindre. Sinon, vous pouvez le faire :

declare @rowCount int

select @rowCount=@@RowCount

if @rowCount=0
begin
--insert....

0voto

user2836818 Points 1

La solution complète est ci-dessous (y compris la structure du curseur). Un grand merci à Cassius Porcus pour l'aide à l'élaboration de la solution. begin trans ... commit code de l'affichage ci-dessus.

declare @mystat6 bigint
declare @mystat6p varchar(50)
declare @mystat6b bigint

DECLARE mycur1 CURSOR for

 select result1,picture,bittot from  all_Tempnogos2results11

 OPEN mycur1

 FETCH NEXT FROM mycur1 INTO @mystat6, @mystat6p , @mystat6b

 WHILE @@Fetch_Status = 0
 BEGIN

 begin tran /* default read committed isolation level is fine */

 if not exists (select * from all_Tempnogos2results11_uniq with (updlock, rowlock, holdlock)
                     where all_Tempnogos2results11_uniq.result1 = @mystat6 
                        and all_Tempnogos2results11_uniq.bittot = @mystat6b )
     insert all_Tempnogos2results11_uniq values (@mystat6 , @mystat6p , @mystat6b)

 --else
 --  /* update */

 commit /* locks are released here */

 FETCH NEXT FROM mycur1 INTO @mystat6 , @mystat6p , @mystat6b

 END

 CLOSE mycur1

 DEALLOCATE mycur1
 go

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X