Saltar al contenido

¿Cuáles son los valores de retorno de sp_send_dbmail?

Édgar, parte de este gran equipo de trabajo, nos hizo el favor de redactar este escrito ya que domina muy bien el tema.

Solución:

El código de error 101 se debe a que el archivo adjunto del resultado de la consulta es más grande que la opción de configuración del correo electrónico de la base de datos “MaxFileSize”.

Investigación

Mi primer intento de resolver esto fue ejecutar sp_helpttext sobre el sp_send_dbmail procedimiento para ver la implementación:

EXEC sp_helptext 'sp_send_dbmail';

El cuerpo principal de ese procedimiento devuelve un montón de códigos de estado diferentes, desde 0 hasta 21. No menciona 101. Sin embargo, llama a algunos otros procedimientos almacenados, como sysmail_verify_profile_spasí que miré en ese:

EXEC sp_helptext 'sysmail_verify_profile_sp';

Pero eso solo devuelve códigos de 0 a 4.

Más tarde, el proceso llama a sysmail_verify_addressparams_spvamos a ver:

EXEC sp_helptext 'sysmail_verify_addressparams_sp';

Shucks, eso solo devuelve 0 o 1.

el siguiente es sp_RunMailQuery:

EXEC sp_helptext 'sp_RunMailQuery';

llama sysmail_help_configure_value_sp y sp_isprohibitedlos cuales solo devuelven 0 o 1.

Caja negra

al final de sp_RunMailQueryun procedimiento almacenado extendido del sistema se llama: xp_sysmail_format_query.

No podemos obtener el código fuente para esto, pero tuve una corazonada al principio del proceso:

--Get the maximum file size allowed for attachments from sysmailconfig.  
EXEC msdb.dbo.sysmail_help_configure_value_sp @parameter_name = N'MaxFileSize',   
                                            @parameter_value = @fileSizeStr OUTPUT

Me di cuenta de que está utilizando el parámetro adjunto, y los resultados de la consulta + el tamaño máximo del archivo también pasan al procedimiento almacenado extendido.

ciudad repro

Configuré el tamaño máximo de archivo de mi correo de base de datos en 10 bytes y luego ejecuté:

DECLARE @result AS INT;

exec @result = msdb.dbo.sp_send_dbmail
    @profile_name = 'DBMail',  
    @recipients = '[email protected]',  
    @subject = 'This is the subject',
    @body = 'This is the body',
    @body_format='html',
    @query = 'SELECT * FROM sys.messages;',
    @exclude_query_output = 1,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'big-file.csv',
    @query_result_separator = '===',
    @query_result_header = 1;

SELECT @result;

Nota: la tabla “sys.messages” tiene un montón de string datos que sabía serían más de 10 bytes.

Y efectivamente, obtuve 101 como código de retorno:

error 101

Bugz

Como señaló amablemente CR241, la documentación dice que @@ERROR debe contener el número de identificación de error que corresponde al mensaje de error apropiado en el sys.messages mesa:

El código de error de la declaración que falló se almacena en la variable @@ERROR. – sp_send_dbmail – Valores de código de retorno

En cambio, es 0 en mi prueba (que anotó en su pregunta original). Esto me parece un error.

Aquí tienes las comentarios y calificaciones

¡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 *