2010-03-23 8 views
3

J'essaye d'attraper l'erreur SQL soulevée quand j'exécute une procédure stockée sur un serveur lié. Les deux serveurs sont en cours d'exécution SQL Server 2005.TRY CATCH avec le serveur lié dans SQL Server 2005 ne fonctionne pas

Pour prouver la question que j'ai créé une procédure stockée sur le serveur lié appelé Raise erreur qui exécute le code suivant:

RAISERROR('An error', 16, 1); 

Si j'exécute la procédure stockée directement sur le serveur lié en utilisant le code suivant je reçois un jeu de résultats avec « une erreur », « 16 » comme prévu (par exemple le code entre dans le bloc catch):

BEGIN TRY 
EXEC [dbo].[RaiseError]; 
END TRY 
BEGIN CATCH 
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int; 
    SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY(); 
    SELECT @ErrMsg, @ErrSeverity; 
END CATCH 

Si je lance le code suivant sur mon serveur local pour exécuter la procédure stockée sur le serveur lié puis SSMS me donne le message 'Requête terminée avec des erreurs', .MSG 50000, Niveau 16, État 1, Procédure RaiseError, ligne 13 Une erreur »

BEGIN TRY 
    EXEC [Server].[Catalog].[dbo].RaiseError 
END TRY 
BEGIN CATCH 
    DECLARE @SPErrMsg nvarchar(4000), @SPErrSeverity int; 
    SELECT @SPErrMsg = ERROR_MESSAGE(), @SPErrSeverity = ERROR_SEVERITY(); 
    SELECT @SPErrMsg, @SPErrSeverity; 
END CATCH 

Ma question est ce que je peux attraper l'erreur générée lorsque le Linked procédure stockée du serveur s'exécute?

Merci d'avance!

Répondre

4

Voir Handling Errors in Server-to-Server Remote Stored Procedures:

Appel RAISERROR avec gravité moins de 20 à l'intérieur d'une procédure stockée distante provoque une déclaration abort erreur sur le serveur distant. A La construction TRY ... CATCH sur le serveur local gère les erreurs d'annulation de lot à distance uniquement. Si une appels de procédure stockée à distance RAISERROR avec gravité moins de 20 et de la procédure stockée à distance est portée définie dans un bloc TRY sur le serveur local, RAISERROR ne provoque pas le contrôle de passe au bloc CATCH du TRY ... Construction CATCH. Cependant, RAISERROR avec la sévérité 20 ou supérieure sur le serveur distant interrompt la connexion et l'exécution sur le serveur local passe au bloc CATCH.

+0

vrai. Article http://msdn.microsoft.com/en-us/library/ms191515.aspx explique cela. Ennuyeux comme vous devez être dans le rôle sysadmin ou les utilisateurs avec l'autorisation ALTER TRACE, et utilisez WITH LOG pour élever une erreur avec une gravité de 20 à 25. –

3

Cela renvoie les informations d'erreur au niveau local:

EXEC ('your.fullyqualified.storedprocname') AT YOUR_LINKED_SERVER; 
+0

C'est exactement ce que je cherchais! Un moyen de retourner les erreurs du serveur distant lié localement! Nous pouvons également ajouter une instruction SQL comme 'EXEC ('select * from orders') AT << LINKED_SERVER_NAME >>' – Baodad

Questions connexes