none
Problema ao colocar select para enviar resultado por e-mail RRS feed

  • Pergunta

  • Boa tarde.

    Estou com um problema para enviar o resultado de uma select port e-mail no sql server 2012. Esta me apresentado a seguinte mensagem.

    "Mensagem 116, Nível 16, Estado 1, Linha 22
    Somente uma expressão pode ser especificada na lista de seleção quando a subconsulta não é introduzida com EXISTS."

    Segue abaixo minha query

    DECLARE @p_body as nvarchar(max), @p_subject as nvarchar(max)
    DECLARE @p_recipients as nvarchar(max), @p_profile_name as nvarchar(max)

    SET @p_profile_name = N'Estoque Minimo'
    SET @p_recipients = N'teste@dominio.com.br'
    SET @p_subject = N'Teste de envio'
    SET @p_body = '<b>Segue em anexo o Relatório de Produtos abaixo doestqoeu mínimo.</b>'
                  + '<table border=1 width="100%"><tr><th colspan="8" bgcolor="darkblue">'
                  + '<h3>Relatorio de Estoque para Compras </h3></th></tr>' --titulo da tabela
                  + '<tr bgcolor="lightblue"><th>Produto<th>Saldo<th><th>Saldo em Compras<th><th><th>Estque Minimo<th></tr>' --colunas do email
                  + ( SELECT DISTINCT
    SB1.B1_DESC       AS PRODUTO,
    SUM(SB8.B8_SALDO) AS SALDO,
    (SC7.C7_QUANT - SC7.C7_QUJE) AS [SALDO DE COMPRAS],
    SC7.C7_NUM AS PEDIDO,
    SB1.B1_EMIN AS [SALDO MINIMO EM ESTOQUE]
    FROM DADOSADV12.dbo.SB1010 AS SB1
    INNER JOIN DADOSADV12.dbo.SB8010 AS SB8 WITH(NOLOCK) ON SB8.B8_PRODUTO = SB1.B1_COD
    INNER JOIN DADOSADV12.dbo.SC7010 AS SC7 WITH(NOLOCK) ON SC7.C7_PRODUTO = SB1.B1_COD
    WHERE SB1.B1_COD = '000070'
    AND SB8.B8_LOCAL IN ('01', '95')
    AND SC7.C7_ENCER <> 'E'
    AND SB1.D_E_L_E_T_ = ''
    AND SB8.D_E_L_E_T_ = ''
    AND SC7.D_E_L_E_T_ = ''
    GROUP BY SB1.B1_DESC, SB1.B1_EMIN, SC7.C7_QUANT, SC7.C7_QUJE, SC7.C7_NUM)
    EXEC msdb.dbo.sp_send_dbmail
      @profile_name = @p_profile_name,
      @recipients = @p_recipients,
      @body = @p_body,
      @body_format = 'HTML',
      @subject = @p_subject


    JUNIOR GUERREIRO T.I

    quarta-feira, 4 de julho de 2018 16:23

Respostas

Todas as Respostas

  • Boa tarde Junior,

    Acredito que o problema seja que a sua variável @p-body está recebendo o resultado de um SELECT que retorna vários campos. Nesse caso, ou você precisa concatenar o resultado do SELECT em um único campo, ou obter esses valores com variáveis e atribuir depois em @p-body.

    Outra coisa, aparentemente seu SELECT retorna uma única linha pois é filtrado no WHERE o campo SB1.B1_COD. Está correto. Certifique-se de que sempre retorne apenas uma linha nesse SELECT, senão você vai obter uma mensagem dizendo que a subquery retornou mais de uma valor.

    Abaixo um exemplo de código concatenando as colunas do select em uma única coluna para atribuir em @p-body. Certamente você terá que mudar isso e colocar as tags <tr> e <td> para ficar de acordo com a sua tabela.

    DECLARE @p_body as nvarchar(max), @p_subject as nvarchar(max)
    DECLARE @p_recipients as nvarchar(max), @p_profile_name as nvarchar(max)
    
    SET @p_profile_name = N'Estoque Minimo'
    SET @p_recipients = N'teste@dominio.com.br'
    SET @p_subject = N'Teste de envio'
    SET @p_body = '<b>Segue em anexo o Relatório de Produtos abaixo doestqoeu mínimo.</b>'
                  + '<table border=1 width="100%"><tr><th colspan="8" bgcolor="darkblue">'
                  + '<h3>Relatorio de Estoque para Compras </h3></th></tr>' --titulo da tabela
                  + '<tr bgcolor="lightblue"><th>Produto<th>Saldo<th><th>Saldo em Compras<th><th><th>Estque Minimo<th></tr>' --colunas do email
                  + (SELECT DISTINCT
    	SB1.B1_DESC + ', ' -- Campos separados por vírgula
    	SUM(SB8.B8_SALDO)  + ', '
    	(SC7.C7_QUANT - SC7.C7_QUJE)  + ', '
    	SC7.C7_NUM  + ', '
    	SB1.B1_EMIN
    FROM DADOSADV12.dbo.SB1010 AS SB1 
    INNER JOIN DADOSADV12.dbo.SB8010 AS SB8 WITH(NOLOCK) ON SB8.B8_PRODUTO = SB1.B1_COD
    INNER JOIN DADOSADV12.dbo.SC7010 AS SC7 WITH(NOLOCK) ON SC7.C7_PRODUTO = SB1.B1_COD
    WHERE SB1.B1_COD = '000070'
    AND SB8.B8_LOCAL IN ('01', '95')
    AND SC7.C7_ENCER <> 'E'
    AND SB1.D_E_L_E_T_ = ''
    AND SB8.D_E_L_E_T_ = ''
    AND SC7.D_E_L_E_T_ = ''
    GROUP BY SB1.B1_DESC, SB1.B1_EMIN, SC7.C7_QUANT, SC7.C7_QUJE, SC7.C7_NUM)
    
    EXEC msdb.dbo.sp_send_dbmail
      @profile_name = @p_profile_name,
      @recipients = @p_recipients,
      @body = @p_body,
      @body_format = 'HTML',
      @subject = @p_subject
    Espero ter ajudado


    quarta-feira, 4 de julho de 2018 16:40
  • Joao obrigado pela atenção, mas colocando as virgulas ainda nao deu certo


    JUNIOR GUERREIRO T.I

    quarta-feira, 4 de julho de 2018 19:21
  • Joao obrigado pela atenção, mas colocando as virgulas ainda nao deu certo


    JUNIOR GUERREIRO T.I

    O erro ainda é o mesmo?
    quarta-feira, 4 de julho de 2018 20:55
  • Deleted
    quarta-feira, 4 de julho de 2018 21:27
  • Muito obrigado José deu certinho aqui vlw.

    JUNIOR GUERREIRO T.I

    quarta-feira, 4 de julho de 2018 22:00