Bonjour,
J'ai un souci récurrent en SQL, et je me demande s'il n'y a pas une solution "simple" à mettre en place.
Mettons une table des clients (id, code, nom, prenom, etc.)
Je dois m'interfacer avec un autre serveur.
Je récupère donc dans une base tampon toutes les données du serveur distant, puis je fais un différentiel entre ce qui a été modifié, ajouté et supprimé.
Et je recopie les lignes en écart.
Du coup je vais ça à grand coup de INSERT from SELECT.
Et la base distante étant une petite rigolote, des fois j'ai des changements de type sans être notifié, et du jour au lendemain je me retrouve à insérer dans ma table tampon des varchar(50) dans une colonne varchar(10) et ça plante.
Existe-t-il un moyen, qui ne soit pas une usine à gaz (genre pas tester la longueur de chaque colonne une à une) qui permette non pas de planter la requête, mais simplement ignorer les lignes en erreur, soit en alimentant une table de rejet (l'idéal) soit simplement en déclenchant un message d'erreur qui ne soit pas bloquant (et qui ne fasse donc pas échouer le reste de la requête) ?
Car actuellement, je suis obligé de détecter quand ma requête échoue, et mon interface reste complètement bloquée jusqu'à ce que je corrige (ce que je ne peux pas toujours faire dans l'immédiat) et si je détecte mal l'anomalie, je me retrouve avec une table tampon vide, donc mon programme croit qu'il faut vider la table des clients et là c'est tout de suite moins drôle.
La solution alternative consisterait à traiter les lignes 1 à 1 de manière séquentielle... Mais là d'un traitement de 2 minutes plus plusieurs centaines de milliers de clients, on va passer à 4 heures...
L'idéal serait d'avoir une comme un peu comme MERGE sauf qu'au lieu de tester l'existence d'une ligne par exemple pour faire un insert ou update, ce serait de tester l'erreur lors de l'insertion de la ligne, et de faire autre-chose si l'insert échoue.
Partager