2009-06-22 7 views
0

Supposons que je réalise une insertion ou une mise à jour sur une table. Ainsi, dans le BEGIN CATCH/END CATCH Je peux définir une variable à ERROR_MESSAGE() et récupérer mon message d'erreur:Comment puis-je renvoyer des informations de ligne sur une insertion/mise à jour échouée dans SQL Server?

Impossible d'insérer la valeur NULL dans la colonne 'columnname', table 'table'; La colonne n'autorise pas les valeurs NULL. INSERT échoue.

Y at-il un moyen que je pourrais retourner dire la clé primaire de l'enregistrement incriminé ou quoi que ce soit pour identifier quelle ligne a réellement échoué? Je annule la transaction en cas d'échec, donc ce n'est pas comme si je pouvais regarder le dernier enregistrement pour voir le suivant qui a le problème.

Répondre

2

Ce n'est pas possible AFAIK étant donné que vous ne travaillez pas vraiment sur un enregistrement à la fois.

Bien sûr, pour les insertions, aucune clé primaire n'est encore affectée. Si vous avez vraiment besoin de ce niveau de détail granulaire, le meilleur conseil que je puisse vous donner est d'insérer/mettre à jour une ligne à la fois pour que vous sachiez à coup sûr laquelle des deux a jeté l'erreur.

+0

d'une manière ou d'une autre j'avais peur que ce soit la réponse pour aucune autre raison que je déteste penser que je fais ce truc depuis longtemps et je ne l'ai jamais rencontré ... –

0

Personnellement, je vérifie mes données pour des choses comme ça avant d'essayer de faire un insert. N'essayez pas de travailler un enregistrement à la fois. Au lieu de cela, écrivez quelque chose qui va chcek pour les données qui ne sont pas là pour les champs obligatoires. Si vous placez les informations sur ce qui a échoué dans une variable de table au moment de la vérification, elle sera toujours disponible après la restauration et vous pourrez ensuite l'insérer dans une table d'erreurs permanente pour voir quels enregistrements causaient le problème.

+0

Par le fait que l'affiche utilise TRY/CATCH dans T-SQL Je suppose que les données sont déjà toutes côté serveur, insérant ainsi une ligne à la fois, je ne vois pas comme étant pire que de rouler une charge plus tard. –

+0

effectivement les données sont en cours de calcul, certains des calculs impliquant plusieurs champs. Certes, je pourrais facilement tout emballer mais j'espérais plus pour quelque chose que je pourrais utiliser comme diagnostic puisque les champs ne sont jamais censés être NULL donc ça aiderait à valider mes calculs. –

+0

L'utilisation de try catch n'a rien à voir avec le traitement d'un étau par un groupe de rangées. C'est juste une erreur de gestion. – HLGEM

Questions connexes