|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : février 2007 Messages : 4 ![]() |
bonjour,
J'ai un problème que je n'arrive pas à résoudre, le trigger ci-dessous provoque une erreur Microsoft SQL Native Client, Native Error 523, Error State 12, Severity 16, Un déclencheur a retourné un ensemble de résultats et/ou fonctionnait avec SET NOCOUNT OFF tandis qu'un autre ensemble de résultats en suspens était actif. Si je désactive le trigger, je n'ai pas d'erreur, si j'active le trigger en supprimant tout le code et en laissant uniquement la déclaration du curseur, j'ai également l'erreur. L'ajout de "set nocount on" ne change rien. Merci de votre aide. Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Je suis désolé de vous le dire mais ce que vous avez écrit est le parfait exemple de tout ce qu'il ne faut pas faire : - ne jamais utiliser les curseurs : SQL est un langage déclaratif et ensembliste : ce n'est à vous de dicter à SQL Server ce qu'il doit faire. Vous exprimez ce dont vous avez besoin, pas la façon de l'obtenir : SQL Server sait bien mieux que nous comment il doit procéder. D'autre part SQL est un langage qui est conçu pour traiter les données dans leur ensemble, et non pas dans leur unité comme vous le faire avec un curseur. En conséquence les curseurs sont très contre-performants, comme la marche arrière d'une voiture : elle est livrée avec la voiture, mais on ne s'en sert que lorsque c'est nécessaire - ne jamais utiliser un curseur dans un trigger : un trigger rallonge une transaction, puisqu'il fait partie de la transaction qui l'a déclenché. Donc il faut faire en sorte qu'il s'exécute le plus vite possible. Or avec un curseur, vous faites exactement l'inverse. - 2 des variables dont vous vous servez pour le FETCH sont inutilisées, ce qui signifie que vous manipulez plus de données que nécessaire. Donc vous consommez plus de mémoire du fait de votre curseur, qui pourrait être allouée à d'autre données. - le nom des objets que vous vous manipulez, ici les tables (mais cela vaut aussi pour les procédures stockées, fonctions, vues, ...) doivent être qualifiés par le nom du schéma auquel ils appartiennent. Comme vos tables sont par défaut stockées dans le schéma dbo, vous avez supposé que c'est toujours le cas pour toutes les tables et autres objets. Avez-vous jeté un œil au schéma sys et INFORMATION_SCHEMA ? En ne le précisant pas, vous forcez SQL Server à le chercher à chaque fois à votre place ... Mais même en le réécrivant en quelques requêtes : Code :
Cela fera peut-être passer l'erreur, mais la vitesse de traitement sera de toute façon longue. Voyez si vous ne pouvez pas le faire dans une procédure stockée, et si les index qui sont sur la table TABLE1 sont les bons. Enfin sachez que les jointures sur des colonnes stockant des valeurs de type chaîne de caractère ou utilisant des fonctions sont contre-performants. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
10
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2007 Messages : 4 ![]() |
bonjour et merci pour ces conseils avisés que je ne manquerais pas de mettre en application. Le problème c'est que dans mon cas actuel, ma table est tellement petite que je n'ai pas à me soucier des temps de réponse, le plantage SQL que j'obtiens est immédiat dès le premier enregistrement traité et suite à mes tests je constate que ce n'est pas le code du trigger qui est en cause mais bel est bien la déclaration du trigger en lui-même. en effet, j'ai fait un test en supprimant tout le code du trigger (je laisse CREATE TRIGGER ... AS BEGIN END) et le plantage SQL se produit encore.
Je cherche donc à comprendre la signification du message d'erreur suivant : Un déclencheur a retourné un ensemble de résultats et/ou fonctionnait avec SET NOCOUNT OFF tandis qu'un autre ensemble de résultats en suspens était actif. Cela me permettra peut-être de trouver la cause du problème. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com