none
SSIS Recibir respuesta de ETL y monitorear proceso desde C# RRS feed

  • Pregunta

  • Buebas Tardes,

    Compañeros necesito de su amable colaboración con el siguiente caso,  tengo una página Web la cual por medío de un Botón llama a un Servicio ASP.NET Web API, internamente el servicio por medio de C# ejecuta en procedimiento almacenado que se encuentra en la Base de Datos de SQL Server, este procedimiento almacenado contiene las siguientes instrucciones donde ejecuta un Paquete ETL del Catalogo de SSIS

    	Declare @execution_id bigint  
    	EXEC [SSISDB].[catalog].[create_execution] @package_name=N'DuplicarRQ.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'DataCloudTrs', @project_name=N'DataCloudTrs', @use32bitruntime=False, @reference_id= NULL  
    
    	DECLARE @GUID NVARCHAR(100) = NEWID()
    
    	DECLARE @var0 smallint = 1  
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0  
    	
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'GUID', @parameter_value=@GUID  
    
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'AudFechaIngreso', @parameter_value=@AudFechaIngreso  
    	
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'AudUsuarioIngreso', @parameter_value=@AudUsuarioIngreso
    	
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'EstadoSolicitudIdBorrador', @parameter_value=@EstadoSolicitudIdBorrador
    	
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'RQId', @parameter_value=@RQId
    
    	DECLARE @Connection NVARCHAR(300) = 'Data Source=STEVEN;Initial Catalog=DataCloudTrs;Integrated Security=True;Application Name=SSIS-Package-{A148298C-A57F-40EA-A3B7-F9F6505600CA}STEVEN.DataCloudTrs;'
    	EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'Connection', @parameter_value=@Connection
    	
    	EXEC [SSISDB].[catalog].[start_execution] @execution_id  
    	
    	SET @Id  = @GUID
    
    	SET @Error = @@ERROR
    Hasta el momento el paquete se ejecuta correctamente y hace lo que tiene que hacer, el inconveniente consiste en que, al mandar a ejecutar el paquete ETL, este se ejecuta de forma asíncrona lo cual esta bien, pero al mandarlo a ejecutar desde un procedimiento almacenado este no me hace la espera hasta que termine de procesarce el paquete como ejemplo un await de C# en las operaciones asíncronas. Debido a esto el ejecuta el paquete y sale de la instrucción del procedimiento almacenado y a mí codigo en C# le dice que Ok que el procedimiento ya se ejecuto correctamente, y que puede seguir con la siguiente instrucción en C#, a lo cual viene el problema por que la siguiente instrucción no se puede ejecutar hasta que el paquete ETL termine de realizar su trabajo, y en este momento se esta ejecutando y realizando operaciones sin haber esperado a que se termine de ejecutar la ETL, el await en C# no me funciona por que el trabajo asíncrono se esta ejecutando es en SQL y el procedimiento almacenado solo me dice que ya ejecuto el paquete pero no lo espera......¿Como puedo hacer para que el procedimiento espere hasta terminar que el ETL complete su trabajo.......es posible crear await en SQL Server el las consultas?....tengo entendido que las instrucciones de SQL Server se ejecutan sincrónicamente, ¿Como puedo saber que % de procesado lleva el paquete ETL para poder mostrar una barra desde mi pagina Web?

    Me sería de mucha ayuda cualquier indicio que tengan, para poder llegar a una solución.

    Muchas Gracias

    miércoles, 6 de junio de 2018 22:30

Respuestas

  • Podrías poner al final del paquete SSIS un Task que sea una llamada a servicio Web. Desde ese task haces una llamada a otra función de tu Servicio ASP.NET Web API, y dentro de esa función continúas ejecutando las instrucciones de C# que originalmente tenías metidas detrás de la primera llamada que inició el ETL.
    jueves, 7 de junio de 2018 6:41