Saltar al contenido

¿Puedo iniciar un procedimiento almacenado y regresar inmediatamente sin esperar a que finalice?

Hola usuario de nuestro sitio, hemos encontrado la respuesta a tu interrogante, desplázate y la obtendrás aquí.

Solución:

Parece que hay varias formas de lograr esto, pero encontré que la forma más sencilla fue la sugerencia de Martin de configurar el procedimiento en un trabajo de SQL e iniciarlo usando el comando asíncrono sp_start_job de mi procedimiento almacenado.

EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'

Esto solo funciona para mí porque no necesito especificar ningún parámetro para mi procedimiento almacenado.

Otras sugerencias que pueden funcionar dependiendo de su situación son

  • Usar SQL Service Broker como sugieren Martin y Sebastian. Esta es probablemente la mejor sugerencia si no le importa la complejidad de configurarlo y aprender cómo funciona.

  • Ejecutar el proceso de forma asincrónica en el código responsable de ejecutar el procedimiento almacenado, como sugirió el Sr. Brownstone.

    No es una mala idea, sin embargo, en mi caso, el procedimiento almacenado se llama desde varios lugares, por lo que encontrar todos esos lugares y asegurarse de que también llamen al segundo procedimiento no parecía tan práctico. Además, el segundo procedimiento almacenado es bastante crítico y olvidar ejecutarlo podría causar algunos problemas importantes para nuestra empresa.

  • Haga que el primer procedimiento establezca una bandera y configure un trabajo recurrente para verificar esa bandera y ejecutar si está configurado, como sugirió Jimbo. No soy un gran admirador de los trabajos que se ejecutan constantemente y verifican los cambios cada pocos minutos, pero ciertamente es una opción que vale la pena considerar según su situación.

Puede usar el agente de servicio junto con la activación en la cola. Con eso, podría publicar los parámetros para la llamada al procedimiento en la cola. Eso lleva tanto tiempo como una inserción. Una vez confirmada la transacción y posiblemente unos segundos más, la activación llamaría automáticamente al procedimiento del receptor de forma asincrónica. Simplemente tendría que tomar los parámetros de la cola y hacer el trabajo deseado.

Esta vieja pregunta merece una respuesta más completa. Algunos de estos se mencionan en otras respuestas/comentarios aquí, otros pueden funcionar o no para la situación específica de OP, pero pueden funcionar para otros que buscan llamar a procesos almacenados de forma asíncrona desde SQL.

Solo para ser totalmente explícito: TSQL hace no (por sí mismo) tener la capacidad de iniciar otras operaciones TSQL de forma asíncrona.

Eso no significa que todavía no tengas muchas opciones:

  • Empleos de Agente SQL: Cree varios trabajos de SQL y prográmelos para que se ejecuten en el momento deseado, o inícielos de forma asíncrona desde un proceso almacenado de “control maestro” usando sp_start_job. Si necesita monitorear su progreso programáticamente, solo asegúrese de que cada trabajo actualice una tabla JOB_PROGRESS personalizada (o puede verificar si ya terminaron usando la función no documentada xp_sqlagent_enum_jobs como se describe en este excelente artículo de Gregory A. Larsen). Debe crear tantos trabajos separados como desee que se ejecuten procesos paralelos, incluso si están ejecutando el mismo proceso almacenado con diferentes parámetros.
  • Paquete SSIS: para escenarios asincrónicos más complicados, cree un paquete SSIS con un flujo de tareas de bifurcación simple. SSIS lanzará esas tareas en spids individuales, que SQL ejecutará en paralelo. Llame al paquete SSIS desde un trabajo del agente SQL.
  • Aplicación personalizada: escriba una aplicación personalizada sencilla en el idioma de su elección (C#, Powershell, etc.), utilizando los métodos asincrónicos proporcionados por ese idioma. Llame a un proceso almacenado de SQL en cada subproceso de la aplicación.
  • Automatización OLE: En SQL, utilice sp_oacreate y sp_oamethod para iniciar un nuevo proceso llamándose entre sí proceso almacenado como se describe en este artículo, también por Gregory A. Larsen.
  • Corredor de servicios: Considere el uso de Service Broker, un buen ejemplo de ejecución asíncrona en este artículo.
  • Ejecución paralela de CLR: Utilice los comandos CLR Parallel_AddSql y Parallel_Execute como se describe en este artículo por Alan Kaplan (solo SQL2005+).
  • Tareas de Windows programadas: Listado para completar, pero no soy un fanático de esta opción.

Si fuera yo, probablemente usaría varios trabajos del Agente SQL en escenarios más simples y un paquete SSIS en escenarios más complejos.

En su caso, llamar a trabajos del Agente SQL suena como una opción simple y manejable.

un comentario final: SQL ya intenta paralelizar operaciones individuales siempre que puede*. Esto significa que ejecutar 2 tareas al mismo tiempo en lugar de una después de la otra no garantiza que terminará antes. Pruebe cuidadosamente para ver si realmente mejora algo o no.

Tuvimos un desarrollador que creó un paquete DTS para ejecutar 8 tareas al mismo tiempo. Desafortunadamente, solo era un servidor de 4 CPU 🙂

*Asumiendo la configuración predeterminada. Esto se puede modificar alterando el Grado máximo de paralelismo o Máscara de afinidad del servidor, o usando la sugerencia de consulta MAXDOP.

Te mostramos reseñas y calificaciones

Si te sientes motivado, tienes el poder dejar un tutorial acerca de qué te ha parecido este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *