Bonjour a tous,
en fouillant rapidement les possibilites de transact-sql (il y en a quand meme pas mal et on en oublie souvent), je suis tombe sur CASE que je n'avais jusqu'a present jamais utilise.
Or nous avons dans un jeu, une table definissant la liste des "items" possedes par les personnages, avec pour chaque item une ligne de la forme :
- le nom du personnage qui possede
- l'index de l'objet dans l'inventaire du personnage
- le nombre d'utilisations restantes
- le Status de l'objet (0 indisponible, 1 dans l'inventaire...)
On utilise beaucoup ce Status, et donc lorsqu'un joueur utilise un Item, on commence par reduire le nombre d'utilisations restantes par un update, puis si ce nombre devient nul, on fait un nouvel update pour rendre l'objet indisponible (requete de la forme suivante en gros) :
Mon idee serait donc de reunir tout ca sous une seule requete, qui update les 2 nombres a la fois (si le nombre restant est 1, on sait qu'il finira a 0 apres l'update et donc, on place le status a 0 aussi car l'objet devient inutilisable)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UPDATE tblObjets SET Restant = Restant - 1 WHERE Perso = @lePerso AND Index=@indexObjet AND Status <> 0 UPDATE tblObjets SET Status = 0 WHERE Restant = 0 Perso = @lePerso AND Index=@indexObjet AND Status <> 0
(J'espere que les exemples de code sont clairs)
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE tblObjets SET Status = CASE WHEN Restant = 1 THEN 0 ELSE 1 END, Restant = Restant - 1 WHERE Perso = @lePerso AND Index=@indexObjet AND Status <> 0
Voila donc le concept. Mais mon collegue pense que l'utilisation de CASE ralentit trop le process et serait en realite plus lent que faire les 2 update a la suite, ce dont je ne suis pas du tout certain. Du coup, j'aurais aime savoir ce qui selon vous (par experience si possible ^^) est le plus rapide et efficace : avec ou sans CASE ?
Merci d'avance.
ps: oui je sais, on pourrait supprimer Status et juste utiliser "Restant" pour tester la dispo ou pas de l'item (si different de 0, hop l'item est dispo nickel), mais il se trouve que ce n'est pas possible dans la majorite des cas car status a plus de 2 valeurs dans le cas reel, donc une reelle signification plus que binaire ^_^
Partager