2008-09-24 4 views
0

J'ai besoin d'aide pour consigner les erreurs de T-SQL dans SQL Server 2000. Nous devons consigner les erreurs que nous piègeons, mais nous avons du mal à obtenir les mêmes informations que celles que nous aurions SQL Server Management Studio.Récupérer le texte d'erreur de l'erreur SQL Server 2000

je peux obtenir un message sans substitution d'arguments comme celui-ci:

SELECT MSG.description from master.dbo.sysmessages MSG 
INNER JOIN sys.syslanguages LANG ON MSG.msglangID=LANG.msglangid 
WHERE [email protected] AND [email protected]@LANGID 

Mais je n'ai trouvé aucune façon de trouver les arguments d'erreur. Je veux voir:

MYCONSTRAINT2 violation Constraint sur la table MYTABLE7

pas

violation Constraint% s sur de la table%

recherche sur Google a seulement mis en place des systèmes exotiques à l'aide DBCC OutputBuffer qui nécessitent un accès administrateur et ne sont pas appropriés pour le code de production. Comment obtenir un message d'erreur avec remplacement d'arguments?

Répondre

0

Avez-vous une chance de passer à SQL2005 bientôt? Si c'est le cas, vous pourriez probablement tirer parti de leur modèle TRY/CATCH pour accomplir plus facilement ce que vous essayez de faire.

Les variables exposées dans les prises peuvent vous donner l'objet de jeter l'erreur, le numéro de ligne, un message d'erreur, la gravité, etc. A partir de là, vous pouvez vous connecter, envoyez un e-mail, etc.

+0

J'aurais aimé qu'ils passent à 2005! C'est mon premier choix, mais pas sous mon contrôle. – Clyde

2

Dans. net, la récupération des messages d'erreur (et la sortie de quoi que ce soit à partir impression ou raiserror) à partir du serveur SQL est aussi simple que la mise en une propriété sur votre SqlConnection (.FireInfoMessageEventOnUserErrors = True) et le traitement de l'événement InfoMessage de la connexion. Les données reçues par .Net correspondent à celles que vous obtenez dans la fenêtre Messages de la grille des résultats de SQL Server Management Studio. Tout le code va dans la fonction qui gère l'événement, et vous pouvez faire en sorte que toutes vos connexions pointent vers la même méthode, donc il n'y a rien d'autre à changer dans le reste de l'application en dehors des deux lignes de le code lorsque vous créez de nouvelles connexions pour définir la propriété et l'événement (et vous avez cette abstraire loin si vous avez seulement besoin de le faire en un seul endroit, non?)

Voici un lien vers ce que je considère le definitive error guide for SQL Server.
http://www.sommarskog.se/error-handling-I.html

Dans certaines circonstances, SQL Server continuera le traitement même après une erreur. Voir l'en-tête intitulé What Happens when an Error Occurs? du lien précédent.

+0

Le système client est un service Web ASP.NET. Le message d'erreur s'affiche-t-il correctement dans l'exception? Dans tous les cas, je voudrais toujours faire cela à partir de TSQL. 1, ce serait une refonte majeure de l'application pour restructurer le traitement des erreurs. – Clyde

+0

... et 2, il y a des cas où une erreur au milieu d'une procédure doit être enregistrée, mais l'erreur n'est pas nécessairement quelque chose qui devrait échouer complètement la procédure. Si les composants .NET SQL peuvent générer le message d'erreur, cela implique-t-il que l'information est réellement disponible dans TSQL? – Clyde

+0

J'ai édité ma réponse pour tenir compte de vos questions, mais puisque SO ne vous donnera aucun avis de ce que je poste ici aussi. –

1

Rechercher dans Livres en ligne pour RAISERROR (Décrite)

Vous trouverez la syntaxe ressemble à ceci:

RAISERROR ({ msg_id | msg_str } { , severity , state } 
    [ , argument [ ,...n ] ]) 
    [ WITH option [ ,...n ] ] 

et les arguments d'erreur sont les suivants:

d or I Signed integer 
o Unsigned octal 
p Pointer 
s String 
u Unsigned integer 
x or X Unsigned hexadecimal 

Toute langue à partir de VB a la capacité d'attraper ceux-ci et de vous permettre de prendre les mesures appropriées.

Dave J

+0

Je pense qu'il veut l'obtenir sur Transact-SQL (ou, en d'autres termes, sur le côté serveur) au lieu du côté client de l'application. –

0

FORMATMESSAGE (il existe également dans SQL Server 2000) vous permet de créer des messages dans leur format final à partir des modèles de SYSMESSAGES comme ci-dessus.

Cependant, la commande RAISERROR (qui correspond à peu près à ce que le moteur de base de données utilise lui-même en cas d'erreur) envoie déjà le texte terminé qui peut être piégé et connecté au client. SSMS est un client et ne génère pas ses propres messages: tous les messages proviennent du moteur de base de données.

Cependant, je suppose que vous voulez enregistrer l'erreur T-SQL en utilisant T-SQL. Franchement, vous ne pouvez pas sur SQL Server 2000. Trop d'erreurs sont abortage de lot et de portée pour enregistrer n'importe quoi de manière fiable.

Vous devez être sur SQL Server 2005 pour utiliser TRY/CATCH/ERROR_MESSAGE, ou vous piègez dans le client, puis en utilisant quelque chose comme log4net pour vous reconnecter à SQL Server.

Questions connexes