2017-04-14 1 views
0

Je suis un déclencheur dans une base de données de serveur SQL avec un comportement très étrange, ce sont les instructions étranges:Stringe erreur de déclenchement du délai d'attente

... 
EXEC [ope].[spMissionDepartment] @AircraftId = @vnAircraftId 

RAISERROR('test error', 16, 1) 

END TRY 
BEGIN CATCH 
    SELECT @ErrorMessage = ERROR_MESSAGE() 

    ROLLBACK TRANSACTION 

    RAISERROR(@ErrorMessage, 16, 1) -- strange line 

END CATCH 

Le comportement étrange est ceci:
Si je supprime l'étrange ligne que je reçois dans la page Web l'erreur

TIMEOUT EXPIRÉ. LA PÉRIODE DE TEMPS ÉCOULÉE AVANT L'ACHÈVEMENT DE L'OPÉRATION OU LE SERVEUR NE RÉPOND PAS.

autrement, si je ne pas enlever la ligne étrange, je reçois l'erreur

erreur de test

Il n'y a pas d'autres déclencheurs, de sorte que le exec devrait être la dernière instruction exécutée, comment est-ce possible que je reçois un Timeout seulement sans le Raiserror?

+0

essayer à la ligne étrange 'RAISERROR (@ErrorMessage, 9, 1)' –

+0

Mais si j'utilise 9 comme la gravité, il continuera, et est donc comme il n'y a pas _Raiserror_, le comportement étrange est que la _Raiserror_ devrait être la dernière instruction exécutée, alors pourquoi il y a un timeout après? – davidinho

+0

Peut-être que cela peut vous aider http://sqlhints.com/2013/06/30/differences-between-raiserror-and-throw-in-sql-server/ – GuidoG

Répondre

0

erreurs non perturbées par ... CATCH Construct TRY essayer ... constructions ne piège pas CAPTURE les conditions suivantes:

  1. avertissements ou des messages d'information qui ont une gravité de 10 ou moins.
  2. Les erreurs dont la gravité est supérieure ou égale à 20 arrêtent le traitement des tâches du moteur de base de données SQL Server pour la session. Si une erreur de gravité de 20 ou plus survient et que la connexion à la base de données n'est pas interrompue, TRY ... CATCH gérera l'erreur.
  3. Attentions, telles que les demandes d'interruption client ou les connexions client rompues.
  4. Lorsque la session est terminée par un administrateur système à l'aide de l'instruction KILL.

Les types d'erreurs suivantes ne sont pas traitées par un bloc CATCH quand ils se produisent au même niveau d'exécution que la construction TRY ... CATCH:

  1. des erreurs de compilation, telles que les erreurs de syntaxe, qui empêchent un lot de courir.
  2. Erreurs survenant lors de la recompilation au niveau de l'instruction, telles que les erreurs de résolution de nom d'objet qui se produisent après la compilation en raison d'une résolution de nom différée.
+0

Comment cela aide-t-il? Suggérez-vous qu'il reçoit une erreur qui n'entraîne pas l'exécution du bloc CATCH? Si c'est le cas, alors pourquoi supprimer une ligne dans le bloc CATCH changerait-il le comportement? –

+0

faire une chose encore juste exécuter manuellement le proc dans le studio sql et mettre la déclaration d'impression à chaque étape. alors déterminez sur quelle déclaration cela prendra du temps ... –