2010-01-06 6 views
0

Bonjour J'ai une procédure stockée étendue qui envoie un message d'erreur.Erreur de capture SQL Server de la procédure stockée étendue

srv_sendmsg(pSrvProc, SRV_MSG_ERROR, errorNum, SRV_FATAL_SERVER, 1, 
      NULL, 0, (DBUSMALLINT) __LINE__, 
      buff, 
      SRV_NULLTERM); 

J'ai mis la gravité à SVR_FATAL_SERVER comme un test pour voir si je peux faire le message à lancer une exception dans le sql.

Dans mon SQL que je fais:

BEGIN TRY 
    EXEC dbo.xp_somethingCool 
    SET @Error = @@ERROR 
END TRY 
BEGIN CATCH 
    PRINT 'AN Error occoured!' 
    SELECT ERROR_NUMBER() AS ErrorNumber 
      ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 

Je pense que quand mon xp envoie le message d'erreur l'tsql attraperait l'erreur et sélectionnez le numéro_erreur et error_message. Au lieu de cela, ce qui finit par arriver, c'est que le xp envoie le message et le T-SQL continue son chemin comme si de rien n'était. La variable @@ Error n'est pas définie non plus.

Alors je me demandais s'il y avait un truc pour obtenir SQL pour attraper une erreur d'un XP?

Merci, Raul

+0

Microsoft vous recommande de ne plus utiliser 'srv_sendmsg'. Voir l'avertissement sur http://msdn.microsoft.com/en-us/library/ms164673.aspx – Aaronaught

Répondre

0

Vous pouvez uniquement tester le résultat d'un proc stocké étendu, et l'utiliser pour lancer une exception.

... 
EXEC @rtn = dbo.xp_somethingCool 
IF @rtn <> 0 
    RAISERROR ... 
... 

Dans très termes simples, une procédure stockée étendue est SQL pas exécuté par le moteur de base de données afin que vous ne pouvez pas émettre RAISERROR. Voir KB 190987 pour plus d'informations

0

Vous devriez pouvoir utiliser RAISERROR de lancer une exception. Par commentaire: Vous ne créez pas votre propre proc stocké étendu? Si c'est le cas, vous pouvez utiliser throw ou faire quelque chose comme 1/0 pour lancer une exception.

+0

La question est comment puis-je RAISERROR dans une procédure stockée étendue? – HaxElit

0

Ne soulevez jamais rien de si haut. Tout ce qui est levé avec une sévérité supérieure à 16 annulera le lot, de sorte que votre bloc catch T-SQL n'aura jamais une chance de s'exécuter. Quelque chose d'aussi haut que SVR_FATAL_SERVER arrêtera le serveur immedeatly.

+0

Je ne suis pas en désaccord, mais quand il est soulevé d'un xp, il semble être ignoré, ce qui est la raison pour laquelle je l'ai fait. Je voulais voir si ça faisait quoi que ce soit. Je ne sais pas s'il y a un autre appel api que je peux utiliser pour que le serveur sql traite réellement le message, ou si je manque un drapeau? – HaxElit

+0

Je ne me souviens pas exactement, mais il se peut que la gravité soit plafonnée pour votre propre protection. Essayez d'utiliser 16 pour votre test. –

Questions connexes