2013-05-07 4 views
1

J'ai un proc stocké qui appelle une série de proc stockés dans le cadre d'une mise à jour de compte. Malheureusement, j'ai une limite de 10 minutes (non liée à SQL Server, délai d'attente externe) et parfois il dépasse le délai d'expiration. (Dans les bonnes conditions, cela peut durer une heure.)Appel d'un proc stocké à partir d'un autre proc stocké ** sans ** imbrication

J'ai essayé différentes solutions. Le code est à peu près aussi optimisé qu'il le sera. Une solution consisterait simplement à avoir un proc appelé initial appelé "proc" stocké "réel"; puisque le timeout ne connaît que le proc initial, le proc réel peut continuer sans entrave. Le problème est que SQL-Server imbrique le procs ... proc A ne finira pas tant que le procs qu'il a appelé (procs B, C et D) n'est pas terminé.

La messagerie interne de SQL Server fonctionnerait, mais notre base de données n'est pas compatible. (Hors de mon contrôle.) Je pensais que le proc initial établirait un travail ponctuel (pour courir une minute plus tard) et laisserais le planificateur de travail l'exécuter, mais nos DBAs ne seront probablement pas heureux si j'ajoute et supprimer des tâches tout le temps.

Y at-il un moyen pour un proc stocké d'EXEC un autre proc stocké, puis de quitter immédiatement alors que le proc appelé continue à s'exécuter?

Répondre

2

J'ai résolu cela de deux façons dans le passé. Une option consiste à configurer Service Broker pour envoyer un message dans une file d'attente et, à l'autre extrémité de Service Broker, exécuter la seconde procédure stockée. L'autre alternative consiste à insérer dans une table de file d'attente et d'exécuter un travail d'agent SQL régulièrement (par exemple, toutes les 5-10 minutes), en exécutant la deuxième procédure stockée. Quelle que soit la route, votre premier sproc va s'exécuter, terminer la transaction avec succès, puis la seconde procédure (avec sa propre transaction) reprendra le travail en attente et le complétera.

Pour Service Broker, cette page vous aidera: http://msdn.microsoft.com/en-us/library/ms345108(v=sql.90).aspx

Quoi qu'il en soit, vous êtes à un moment donné impliquant un DBA, mais si vous avez un emploi régulier qui exécute une procédure stockée sur une table de file d'attente, vous n » Il suffit d'ajouter et de supprimer des tâches dans la table de file d'attente (c'est-à-dire une requête ponctuelle d'un administrateur de base pour une configuration par rapport aux demandes en cours d'un administrateur de base de données en ajoutant/supprimant des tâches).

+0

Ne pas "impliquer" un DBA, faites-en "invoquer" un DBA. –

+0

Je l'ai modifié un peu. J'espère que c'est un peu plus clair. –

+0

Désolé, c'était une blague. "Impliquer" est le mot approprié. "Invoquer" est ce que vous faites quand vous voulez traiter avec les démons, les mauvais esprits, les forces des ténèbres ... et les AD. –

Questions connexes