none
problema al enviar un correo con el proc. alm. sp_send_dbmail

    Question

  • Hola Foro.

    tengo windows 2003 y sql server 2005, tengo un procedimiento que genera una consulta de una tabla y el resulto se  envia a un usuario  como un archivo de texto.

    este procedimiento lo ejecuto desde un job.

    -- job

    exec msdb.dbo.sp_send_dbmail @profile_name ='correosql',@recipients ='xxxxx@tony.com.mx;@;yyyyyy@tony.com.mx', @subject='Relación de Certificados Semanales', @query='exec smartdata.dbo.TSP_RelaciondeCertSem',@attach_query_result_as_file = 1

    este job estuvo funcionado bien, pero a partir de una fecha me envia el siguiente mensaje de error:

    Mensaje
    Ejecutado como usuario: NT AUTHORITY\SYSTEM. Error sin especificar en SQL Server. Es posible que el servidor diera por terminada la conexión. [SQLSTATE HY000] (Error 0)  Error formatting query, probably invalid parameters [SQLSTATE 42000] (Error 22050).  Error en el paso.

    me pueden guiar como solucionar este problema, les agradezco de antemano su colaboración.

     

    atte. JAMC

     

    Friday, June 11, 2010 12:28 AM

Answers

All replies

  • En los foros en inglés un problema similar se debía a que la password del servicio Agent había caducado. Posiblemente ese sea el problema, vea el thread en el foro en ingles:

    http://social.msdn.microsoft.com/Forums/en/sqltools/thread/bac7ecee-a156-4313-b532-ba15813a0700

     


    Gustavo Larriera Sosa, Microsoft MVP | ascii164.blogspot.com | /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    Tuesday, June 15, 2010 3:46 PM
  • Hola.

    ¿Resolviste el problema?


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Sunday, June 20, 2010 8:12 PM
  • hola alberto.

    no he podido resolver este problema, hice lo que me pidio Gustavo pero no funciona.

     

    alguna otra sugerencia de favor.

     

    saludos

    JAMC

    Monday, June 21, 2010 6:26 PM
  • Que tal!.

    Bueno, si lo que ha dicho Gustavo no lo ha solucionado entonces el password está bien. Creo que se puede deber a un par de causas:

    1. Cambios en el Stored Procedure que genera tu información. Si lo puedes ejecutar desde el Management Studio con un simple exec smartdata.dbo.TSP_RelaciondeCertSem sin regresar errores entonces queda descartado.

    2. Cambios en la cuenta de dominio por el administrador del directorio activo bajo la cual corre el servicio del SQL Agent.

    3. Las tablas que consulta tu Stored Procedure han crecido a tal grado que la información hace que el archivo ocupe más de 1MB de espacio, el cual es el límite máximo configurado por defecto en todos los Database Mail.

    Si ninguna de estas 3 opciones te ayuda a solucionar el problema entra en la configuración del Mail en Management -> Database Mail, click derecho, seleccionas Configure Database Mail -> Next ->View or Change System Parameters -> Next y cambia la opción "Logging Level" a "Verbose" para que envie al Log del Agente todos los mensajes de error, informativos y warnnings para que tengas más información y podamos dar con el problema.

    Saludos

    Daniel.

     

    Monday, June 21, 2010 9:03 PM
  • Hola Daniel:

    punto 1. lo ejecute no envio ningún error.

    punto 2. no se como hacerlo porque esa parte la revisa otra area. dejame checarlo con ellos.

    punto 3. el tamaño alcanzado en el resulto es de 335 kb.

     

    te paso un archivo .log

    Fecha,Origen,Gravedad,Mensaje
    06/21/2010 19:25:07,,Advertencia,[396] Condición de CPU inactiva no definida: la programación de trabajos OnIdle no tendrá efecto
    06/21/2010 19:25:07,,Error,[355] Error de inicialización del sistema de correo; compruebe los parámetros de configuración
    06/21/2010 19:25:07,,Error,[260] No se puede iniciar la sesión de correo (motivo: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException: No se puede leer la información de configuración de correo de la base de datos. ---> System.Data.SqlClient.SqlException: El nombre de profile no es válido<nl/>   en System.Data.SqlClient.SqlConnection.OnError(SqlException exception<c/> Boolean breakConnection)<nl/>   en System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception<c/> Boolean breakConnection)<nl/>   en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateOb)
    06/21/2010 19:25:06,,Información,[129] SQLSERVERAGENT iniciándose bajo el control del servicio NT de Windows
    06/21/2010 19:25:06,,Error,[364] El servicio Messenger no ha sido iniciado - las notificaciones NetSend no se enviarán
    06/21/2010 19:25:03,,Información,[432] Hay 11 subsistemas en la caché de subsistemas
    06/21/2010 19:25:03,,Información,[339] El equipo local xxxxxxxxx ejecuta Windows NT 5.2 (3790) Service Pack 2
    06/21/2010 19:25:03,,Información,[310] Se detectaron 4 procesadores y 4090 MB de RAM
    06/21/2010 19:25:03,,Información,[103] La biblioteca NetLib utilizada por el controlador es DBNETLIB.dll; el servidor host local es
    06/21/2010 19:25:03,,Información,[102] Controlador ODBC de SQL Server versión 9.00.4035
    06/21/2010 19:25:03,,Información,[101] SQL Server TONYCORPO versión 9.00.4035 (límite de 0 conexiones)
    06/21/2010 19:25:03,,Información,[100] Microsoft SQLServerAgent versión 9.00.4035.00 (compilación x86 unicode comercial) : Id. de proceso 13788

    quedo en espera de tus comentarios

    saludos

    jamc

     

    Tuesday, June 22, 2010 12:44 AM
  • Parece que algo pasa con el profile que utilizas para enviar el correo. Trata de enviar un mail SIN archivos anexos.

    exec msdb.dbo.sp_send_dbmail @profile_name ='correosql',@recipients ='xxxxx@tony.com.mx;@;yyyyyy@tony.com.mx', @subject='Prueba DB Mail', @body='Este es el cuerpo del mensaje de correo electronico. Prueba Database Mail'

    Si continúa enviando el mismo error ahora deberás verificar el profile_name que has configurado. Ve a las propiedades del Agente de SQL Server. En el tab "Alert System" verifica la opción "Mail Session". La opción "Enable Mail Profile" debe estar habilitada. Elige en el combo "Mail System" la opción Database Mail. Poseriormente en "Mail profile" valida que este seleccionado "correosql". Dale OK para que guarde el cambio.

    En el Management Studio abre la capreta Management y después da click derecho sobre el Database Mail. Valida en la Configuración que exista el profile y este ligado al account. Reinicia el servicio (unicamente) del Agente de SQL Server. Realiza la prueba otra vez.

    Si vuelves a tener el mismo fallo abre el Sql Server Surface Area Configuration, selecciona abajo la opción Surface Area Configuration for Features. En la sección Database Mail deshabilita la opción Enable Database Mail stored procedures. Reinicias el servicio del agente de SQL Server. Vuelves al Surface Area Configuration y esta vez habilitas de nuevo la opción Enable Database Mail stored procedures. Reinicias el servicio del agente y ya debería funcionar.

    Espero te ayude. Daniel.

    • Edited by DanielTorres Tuesday, June 22, 2010 9:09 PM falta info
    Tuesday, June 22, 2010 8:54 PM
  • Hola Daniel:

    ya hice todo lo que me dices y de todas manera me envia el mismo mensaje de error.

    revise el visor de sucesos de windows y esta grabando este mensaje de error el MSSQLSERVER.

    Excepción al ejecutar el procedimiento almacenado extendido 'xp_sysmail_format_query' en la biblioteca 'xpstar90.dll'. SQL Server está finalizando el proceso 99. Tipo de excepción: Win32 exception; código de excepción: 0xc0000005.

    ¿Que me siguieres revisar?

     

    saludos

    jamc

    Wednesday, June 23, 2010 5:21 PM
  • Cual es el último Service Pack de tu SQL Server? Ejecuta la instrucción SELECT @@version y postea el resultado.

    ¿Incluso con el ejemplo del envío de mail sin attachment te envía el mismo error?

    Daniel.

    • Edited by DanielTorres Wednesday, June 23, 2010 5:55 PM incluso..
    Wednesday, June 23, 2010 5:37 PM
  • este es el resultado:

    Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

    ejecute el procedimiento sin attachment y no me envio mensaje de error, si recibo el correo a mi cuenta.

     

    jamc

    Wednesday, June 23, 2010 10:24 PM
  • Al menos creo ya envía un correo!! Trata con estas sentencias:

    exec msdb.dbo.sp_send_dbmail
    @profile_name ='correosql',
    @recipients ='xxxxx@tony.com.mx;@;yyyyyy@tony.com.mx',
    @subject='Relación de Certificados Semanales',
    @query='exec dbo.TSP_RelaciondeCertSem',
    @execute_query_database= 'smartdata',
    @attach_query_result_as_file = 1

    Avisame si te resolvió el problema.

    Un Saludo. Daniel

    Wednesday, June 23, 2010 10:53 PM
  • Hola Daniel:

    ya probe de esta forma pero me sigue mandando este mensaje de error:

     

    Mens. 22050, Nivel 16, Estado 1, Línea 0

    Error formatting query, probably invalid parameters

    Mens. 0, Nivel 20, Estado 0, Línea 0

    Error grave en el comando actual. Los resultados, si los hay, se deben descartar.

    gracias por tus sugerencias.

    estuve haciendo pruebas con cada parametro de este procedimiento y el que no funciona es @query, porque de hecho le pongo un  select @@version y de todas manera me envia el mismo mensaje de error. 

    no se que hacer, si volver a actualizar el sp 3 de sql server

    saludos

    jamc.

    Thursday, June 24, 2010 2:56 PM
  • No se si sea mucho pedir pero igual valdría la pena que pongas el código de tu SP. Ayer hice la prueba con un job que yo tengo de envío de mails, en el @query (en mi caso) tengo todo el código, lo pase a un SP y cambie el código por un simple exec y con el parámetro @execute_query_database funciona sin problemas, me envía la misma información.

    Saludos. Daniel

    Thursday, June 24, 2010 3:01 PM
  • pongo lo que hace mi sp

    DECLARE @vAno AS int,@vMes AS int,@vMesc Char(2), @vEjemes CHAR(6), @vFecha char(8), @vFechai smalldatetime, @vFechaf Smalldatetime
    SET NOCOUNT ON
    SET DATEFORMAT YMD

    SELECT @vEjemes=NUMFOLIO FROM SMARTDATA.DBO.P_FOLIOS WHERE TIPOFOL='UPC'
    SET @vAno=CAST(SUBSTRING(@vEjemes,1,4) AS INT);SET @vMes=CAST(SUBSTRING(@vEjemes,5,2) AS INT)
    SET @vMes=@vMes+1
    SET @vFechaf=GETDATE()

    IF @vMes=13  -- Cuando son entradas del siguiente Año
       BEGIN
     SET @vMes=01
     SET @vAno=@vAno+1
       END
    SET @vMesc=CAST(@vMes AS CHAR(2))
    IF LEN(@vMesc)=1
     SET @vMesc='0'+@vMesc
    SET @vFecha=CAST(@vAno as CHAR(4))+@vMesc+'01';SET @vFechai=CAST(@VFecha as smalldatetime)
    IF DATEPART(MONTH,@vFechai)<> DATEPART(MONTH,GETDATE())
       SELECT @vFechaf=DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,GETDATE()  )+1, 0));

    PRINT SPACE(15)+'Relación de Certificados del dia: '+'01 '++ RTRIM(CAST(DATENAME(MONTH,@vFecha) AS CHAR(10))) +' '+ RTRIM(CAST(DATEPART(YEAR,@vFecha) AS CHAR(4)) + ' al ' + CAST(DATEPART(DAY,@vFechaf) AS CHAR(2)))+ ' '+ RTRIM(CAST(DATENAME(MONTH,@vFechaf) AS CHAR(10)))+ ' '+ CAST(DATEPART(YEAR,@vFechaf) AS CHAR(4))
    SELECT Sucursal AS Suc,RTRIM(CAST(Certificado AS CHAR(8))) AS Cert,RTRIM(CAST(Entrada AS CHAR(8))) AS Entrada,
    RTRIM(CAST(DATEPART(dd,Fecha_Ent)AS CHAR(2)))+'-'+RTRIM(CAST(DATEPART(mm,Fecha_Ent)AS CHAR(2)))+'-'+CAST(DATEPART(yyyy,Fecha_Ent)AS CHAR(4)) AS FECHAENT,
    RTRIM(CAST(DATEPART(dd,Fecha_REG)AS CHAR(2)))+'-'+RTRIM(CAST(DATEPART(mm,Fecha_REG)AS CHAR(2)))+'-'+CAST(DATEPART(yyyy,Fecha_REG)AS CHAR(4)) AS FECHAREG,Proveedor,Provsust,Talon_Emb,
    RTRIM(CAST(B_TOTBTOS AS CHAR(5))) AS NBultos,
    CASE WHEN B_INDVAL=0 THEN 'Pendiente' WHEN B_INDVAL=1 THEN 'Modificado' WHEN B_INDVAL=2 THEN 'Valorizado'
    END 'Estatus'
    FROM p_certificados (NOLOCK)
    WHERE    FECHA_ENT>=@vFechai And FECHA_ENT<=@vFechaf
        AND (B_INDVAL=0 OR B_INDVAL=1 OR B_INDVAL=2)
    ORDER BY CERTIFICADO

    saludos

    Thursday, June 24, 2010 5:56 PM
  • Hola.

    ¿Lo conseguiste?

    Como alternativa, puedes usar sp_SQLSMTPMail: http://binaryworld.net/Main/CodeDetail.aspx?CodeId=1528

    Tienes sus cosas, pero funciona. Yo lo llevo usando por muchos años.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Tuesday, June 29, 2010 9:20 PM
  • Hola Alberto: no se pudo solucionar el problema.

    voy a checar tu alternativa, cualquier duda o comentario te pregunto.

     

    muchas gracias a todos por sus aportaciones.

    saludos

    jamc

     

    Tuesday, June 29, 2010 11:37 PM
  • Hola.

    ¿Pudiste usar lo que te propuse?


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    • Proposed as answer by Sujaniano Friday, May 13, 2011 11:52 AM
    Tuesday, July 06, 2010 7:23 PM
  • Hola, a mi tambien me estaba dando ese problema pero en inet he visto una respuesta que lo soluciona,

    y es tan sencillo como definir la Base de datos

    EXEC msdb.dbo.sp_send_dbmail
     @profile_name = 'notificaciones',
     @recipients =  'xxxx@xxxxx',
     @query = 'SELECT * FROM BaseDeDatos.dbo.Tabla',
    .....

    Friday, May 13, 2011 11:54 AM
  • Me paso lo mismo que a ti.

    He creado un Profile y asigno al igual que tu los datos para la salida de mail.

    Luego probando desde mi usuario con permisos de administrador, no tenia problema alguno en enviar mails, pero cuando lo realice desde un usuario restringido me daba un error de no tener permisos para ejecutar el procedure.

    Pensando el motivo, pense que era cuestion de permisos, asi que buscando en internet, tuve que asignar al usuario permisos de ejecucion en la base de datos msdb al procedure sp_send_dbmail.

     

    Volvi a probar y ahora me daba este error:

     

    El nombre de profile no es válido

     

    Luego indagando encontre que en la ficha donde se crean los profile, hay una opcion de seguridad para los profiles, es alli donde tambien hay que asignar el profile como uso Publico o en todo caso de forma Privada al usuario.

     

    Espero que esta sea la solucion a tu problema.

     

    saludos.

    Pedro Valle.

     

    Friday, May 27, 2011 4:24 PM
  • Muchas gracias PedroValle, me sirvió mucho tu respuesta.

    Yo también tenía el problema:  El nombre de profile no es válido.

    Utilizo SQL Server 2008 (SP3).

    Lo solucioné con dos ajustes:

    Primero:

    1. En el Magement Studio ve a Management/Database Mail  y le das clic derecho y elije la opción <Configure Database Mail>.

    2. En el asistente le das siguiente para llegar a la pantalla <Select Configuration Task>. Aqui deberás seleccionar la opción <Manage profile security> y presiona [siguiente].

    3. En la siguiente pantalla que te muestra, elije la pestaña <Public Profiles> y en el listado inferior (en la tabla) se encontrará el perfil que has registrado para tus correos. Marca la primera columna que dice <Public> y presiona [Siguiente] y en la siguiente pantalla presiona [Finish] para aceptar los cambios.

    Segundo (solo si estás utilizando un usuario diferente a SA):

    Nota: Yo tuve un problema con un servicio en mi servidor local, este servicio sincroniza datos de un servidor en otra ciudad con mi server local a través de un Web Services. El punto es que el servicio lo instala un proveedor externo y dicho proveedor utiliza su propio Login o usuario SQL que él registra cuando instala su sistema. Yo hice un trigger que manda un correo dependiendo de una condición. Este trigger está en la tabla donde el servicio antes mencionado deposita los datos de la sincronización. Entonces, el trigger en sí, llamaba al proceso sp_send_dbmail para enviar el correo, pero como el sincronizador se loguea con otro usuario diferente al SA, entonces el sp_send_dbmail se ejecutaba con un usuario sin privilegios para llamar al proceso alojado en la base del sistema <msdb>.

    1. En el Magement Studio ve a: Databases/System Databases/msdb/Security/Users.

    2. Asegúrate que el usuario que esta llamando a sp_send_dbmail (revisar la nota anterior) se encuentre allí, de lo contrario:

    Agrégalo yendo al nodo principal Security (NO es el nodo que está dentro de /System Databases/msdb) y selecciona al usuario o login correspondiente y dale clic derecho y elije <propiedades>. En la pantalla que se abre elije <User Mapping> del panel izquierdo y en el lado derecho en la primera tabla que dice <Users mapped to this login> marca la base de datos <msdb> y presiona [OK].

    3. Una vez que tengas identificado al usuario, dale clic derecho y elije <Propiedades>.

    4. En la pantalla que aparece, elije la opción <General> del panel izquierdo y luego en el lado derecho te vas hasta abajo donde aparece el listado <Database role membership> y marca <DatabaseMailUserRole> y presiona [OK].

    --------------------------------------------------------------

    Tomar en cuenta que la manera correcta de llamar a sp_send_dbmail es:

    EXEC msdb.dbo.sp_send_dbmail

    Sé que mi respuesta está muy retrasada puesto que la pregunta es de Junio/2010, pero la escribo para que quede de evidencia y ayude a otros que como a mi, me sirvió mucho la respuesta. Solo complementé un poco.

    Espero les sea de gran utilidad a otros en el futuro.

    Salu2..


    Desarrollador en .NET


    • Edited by RiosWill Wednesday, November 20, 2013 11:38 PM
    Wednesday, November 20, 2013 11:18 PM