Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde pessoal,
Estou precisando mudar uma SP que tenho.
Essa minha SP cria um codigo html que pelo cursor ele popular as tags td.
Só que eu não quero utilizar cursor. Queria achar um outro meio de conseguir popular as tags sem utilizar cursor para isso.
Penso que seja possível só não sei como fazer. kk
Desde já agradeço..
Boa tarde A.Jr,
Ontem mesmo eu testei e ficou da forma que eu queria, porém, agora estou com um outro problema.
Minha primeira consulta, gera 933 registros e a variável de email está como @EMAIL NVARCHAR(MAX).
Ele chega a executar 933 vezes, porém o que me retorna nessa variável é menos de 70. É como se em uma quantidade x de registro ele não consegue suportar mais nenhum.
Estou postando o código
-- VARIAVEIS EXCLUSIVA DO EMAIL
DECLARE @COUNT INT
,@EMAIL NVARCHAR(MAX)
,@EMAIL_DEST VARCHAR(50)
,@ASSUNTO VARCHAR(100)
-- EMAIL DAS PESSOAS QUE RECEBERAM O EMAIL
SET @EMAIL_DEST = 'emailDest@mail'
-- ASSUNTO DO EMAIL
SET @ASSUNTO = 'Assunto'
--INICIO DO CORPO DO EMAIL
SET ROWCOUNT 0
SELECT
DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
INTO ##TEMP_PERFORMANCE
FROM PERFORMANCE
SET ROWCOUNT 1
SELECT @COUNT = COD FROM ##TEMP_PERFORMANCE
SET @EMAIL = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> '
+'<html xmlns="http://www.w3.org/1999/xhtml"> '
+' <head> '
+' <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> '
+' <title>Untitled Document</title> '
+' </head> '
+' <body> '
+' <div style="width: 689px; height: 80px;"> '
+' <img src="topo.png" width="800" height="83" alt="" />'
+' </div> '
+' <table width="774" Cellspacing="0" Cellpadding="2" border="1" style="text-align:center; background-color: #F2F2F2; margin-left: 2px; padding: 1px; font-family: Arial, Verdana; font-size: 11px"> '
+' <tr> '
+' <th width="350">descri</th>'
+' <th width="400">opera</th>'
+' <th width="100">Matrícula </th>'
+' <th width="40" >Titular </th>'
+' <th width="350">Nome </th>'
+' <th width="350">Grau Parentesco </th>'
+' <th width="400">Idade anterior </th>'
+' <th width="100">Idade nova </th>'
+' <th width="40" >Data Nasc. </th>'
+' <th width="350">Valor antigo </th>'
+' <th width="350">Valor novo </th>'
+' <th width="400">Percentual </th>'
+' <th width="100">E-mail </th>'
+' <th width="40" >DDD </th>'
+' <th width="350">Tel. Cel. </th>'
+' <th width="100">Endereço </th>'
+' <th width="40" >Nº End. </th>'
+' <th width="350">Comp. End. </th>'
+' <th width="350">Bairro </th>'
+' <th width="400">Cidade </th>'
+' <th width="400">UF </th>'
+' <th width="400">CEP </th>'
+' </tr> ' +' <tr> '
+' <td>'+ (SELECT DESCRI FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT NREDUZ FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT MATRICULA FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT NOME FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT NOMUSR FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT DESCRI FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT DE_ANT FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT DE_NOV FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT NASC FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT ANTIGO FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT VL_NOVO FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT PERCENTUAL FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT ENDER FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT NUM_END FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT COMPL FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT BAIRRO FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT MUN FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT EST FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT CEP FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT EMAIL FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT DDDC_ELU FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' <td>'+ (SELECT FONE_CELU FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
+' </tr> '
DELETE ##TEMP_PERFORMANCE WHERE COD = @COUNT
SET ROWCOUNT 1
SELECT @COUNT = COD FROM ##TEMP_PERFORMANCESET @EMAIL = @EMAIL
+' </table> '
+' <div style="width: 689px; height: 45px;"> '
+' <img src="base.png" width="800" height="48" />'
+' </div> '
+' <div style="margin-left: 10px;font-family: Arial, Verdana; font-size: 10px;"><b>NOME ENDE</b><br> '
+' ENDEREÇO '
+' </div> '
+' </body> '
+'</html> '
SELECT @EMAIL
-- DISPARA O E-MAIL
DROP TABLE ##TEMP_PERFORMANCE
Desde já fico agradecido.
Voce pode estar com limitação para exibir os resultados somente.
Na hora de executar, peça para salvar o resultado em csv ao inves de exibir em GRID ou texto.
Então,
Tentei aqui, só que não vai dar certo. Vou mandar isso por email. O que acho engraçado é que com cursor funciona, mas estou muito relutante em deixar com cursor, pois com essa solução ganhei muito tempo na execução.
Tentei utlizar na variável @email o valor NTEXT, porém, descobri que ele não funciona para variáveis locais.
Para funcionar legal, só preciso achar uma maneira de receber alem do valor máximo de varchar ou nvarchar.
cara, vc faz isso em lote ou email por email?
Em lote.. É um unico email enviado e somente uma vez por mês.
Vou postar a solução e no próximo post eu comento ...vlw
-- VARIAVEIS EXCLUSIVA DO EMAIL
DECLARE @COUNT INT
,@EMAIL NVARCHAR(MAX)
,@EMAIL_DEST VARCHAR(50)
,@ASSUNTO VARCHAR(100)
-- EMAIL DAS PESSOAS QUE RECEBERAM O EMAIL
SET @EMAIL_DEST = 'emailDest@mail'
-- ASSUNTO DO EMAIL
SET @ASSUNTO = 'Assunto'
--INICIO DO CORPO DO EMAIL
SET ROWCOUNT 0
DECLARE @TEMP_PERFORMANCE TABLE (
DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
,NUMLINHA INT IDENTITY (1,1)
)
INSERT INTO @TEMP_PERFORMANCE
(DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
)
SELECT
DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
FROM PERFORMANCE
SET ROWCOUNT 1
SELECT @COUNT = COD FROM @TEMP_PERFORMANCE
SET @EMAIL = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> '
+'<html xmlns="[http://www.w3.org/1999/xhtml](http://www.w3.org/1999/xhtml)"> '
+' <head> '
+' <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> '
+' <title>Untitled Document</title> '
+' </head> '
+' <body> '
+' <div style="width: 689px; height: 80px;"> '
+' <img src="topo.png" width="800" height="83" alt="" />'
+' </div> '
+' <table width="774" Cellspacing="0" Cellpadding="2" border="1" style="text-align:center; background-color: #F2F2F2; margin-left: 2px; padding: 1px; font-family: Arial, Verdana; font-size: 11px"> '
+' <tr> '
+' <th width="350">descri</th>'
+' <th width="400">opera</th>'
+' <th width="100">Matrícula </th>'
+' <th width="40" >Titular </th>'
+' <th width="350">Nome </th>'
+' <th width="350">Grau Parentesco </th>'
+' <th width="400">Idade anterior </th>'
+' <th width="100">Idade nova </th>'
+' <th width="40" >Data Nasc. </th>'
+' <th width="350">Valor antigo </th>'
+' <th width="350">Valor novo </th>'
+' <th width="400">Percentual </th>'
+' <th width="100">E-mail </th>'
+' <th width="40" >DDD </th>'
+' <th width="350">Tel. Cel. </th>'
+' <th width="100">Endereço </th>'
+' <th width="40" >Nº End. </th>'
+' <th width="350">Comp. End. </th>'
+' <th width="350">Bairro </th>'
+' <th width="400">Cidade </th>'
+' <th width="400">UF </th>'
+' <th width="400">CEP </th>'
+' </tr> '
WHILE EXISTS (SELECT '' FROM @TEMP_PERFORMANCE WHERE NUMLINHA = @COUNT)SELECT ' <tr> '
+' <td>'+ DESCRI +'</td>'
+' <td>'+ NREDUZ +'</td>'
+' <td>'+ MATRICULA +'</td>'
+' <td>'+ NOME + +'</td>'
+' <td>'+ NOMUSR +'</td>'
+' <td>'+ DESCRI +'</td>'
+' <td>'+ DE_ANT +'</td>'
+' <td>'+ DE_NOV +'</td>'
+' <td>'+ NASC +'</td>'
+' <td>'+ ANTIGO +'</td>'
+' <td>'+ VL_NOVO +'</td>'
+' <td>'+ PERCENTUAL +'</td>'
+' <td>'+ ENDER +'</td>'
+' <td>'+ NUM_END +'</td>'
+' <td>'+ COMPL +'</td>'
+' <td>'+ BAIRRO +'</td>'
+' <td>'+ MUN +'</td>'
+' <td>'+ EST +'</td>'
+' <td>'+ CEP +'</td>'
+' <td>'+ EMAIL +'</td>'
+' <td>'+ DDDC_ELU +'</td>'
+' <td>'+ FONE_CELU +'</td>'
+' </tr> '
FROM @TEMP_PERFORMANCE WHERE NUMLINHA = @COUNT)
SET ROWCOUNT 1
END
SET ROWCOUNT 0
SET @EMAIL = @EMAIL
+' </table> '
+' <div style="width: 689px; height: 45px;"> '
+' <img src="base.png" width="800" height="48" />'
+' </div> '
+' <div style="margin-left: 10px;font-family: Arial, Verdana; font-size: 10px;"><b>NOME ENDE</b><br> '
+' ENDEREÇO '
+' </div> '
+' </body> '
+'</html> '
SELECT @EMAIL
-- DISPARA O E-MAIL
DROP TABLE ##TEMP_PERFORMANCE
Como costumo falar não sou dono da verdade logo pode não ser a melhor solução, mas é o que eu uso..
1- Trocar cursor por tabela temporária é quase trocar 6 por meia dúzia, pois tabela temporária dá queda de performance também
Gosto de usar variáveis do tipo tabela, pois usa memória, mas ao fim do procedimento ela some, e se uso muitas vezes crio um tipo igualzinho a tabela
2 - Inseri na tabela temporária uma coluna numlinha para te dar o número da linha e adicionei um contador...
3 - Na cláusula while troquei por um exists que verifica se ainda existe um número de linha como contador máximo (variável @count)
Não coloquei set @count += 1 no fim do looping, coloca senão fica até o fim do mundo rodando...kkkkkk...só vi depois
4 - Não precisa fazer aqueles select's concatenando aquilo dá queda de performance faz só um
5 - faz tratamento de nulidade com is null pois se o banco estiver configurado pra nulo concatenado é nulo sua string ficará nula...
Espero ter ajudado um pouco
Bom dia Daniel LM Costa,
Realmente me ajudou muito em questão de performance, porém meu problema continua na quantidade de caracteres que passa do limite máximo do VARCHAR ou NVARCHAR. Como falei anteriormente, já tentei utilizar o TEXT, porém sem sucesso.
Se tiver alguma ideia de como resolver essa questão fico agradecido.
Vou continuar pensando em alguma solução para implementar a nova forma que está o código, pois se não conseguir vai ter que ser no cursor mesmo que já está rodando com precisa.
Obrigado.
Uma idéia é você dar um print na variável email, para tentar verificar em qual momento ele para de concatenar, o que quero dizer é que em algum momento esse sql que forma a linha pode não estar retornando resultado.
Uma boa forma de confirmar isso é vendo se o fim do email é printado o </table>
declare
@html varchar(max),
@body varchar(max),
@titulo varchar(100),
@comeco varchar(100),
@fim varchar(100),
@eros int,
@sumario varchar(max),
@tabelahtml varchar(max),
@tabelabody varchar(max),
@html2 varchar(max),
@envio varchar(max)
SET @BODY = 'Corpo'
set @titulo = 'Titulo'
set @comeco = '<html>'
set @fim = '</table></body></html>'
set @html2 = '<br><td align=left>Favor não responder este e-mail.</td>'
set @html = '<head>
<style>' +
'td {padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt; font-family: Calibri;} ' +
'.titulo{color:#ffffff}'+
'.font{color:#ffffff}'+
'H1{font-size:13pt; font-family: Calibri; color:#222222}'+
'.sucesso {background-color:#00ff00}'+
'.falha {background-color:#ff0000}'+
'</style>' +
'</head> <!-- Fecha Cabeçalho -->' +
'<body> <!-- Fecha o corpo do html -->'
set @tabelahtml = @BODY +
'<table cellpadding=0 cellspacing=0 border=1 bordercolor=#376091">' +
'<tr bgcolor=#0F253F class="titulo">'+
'<td align=center><b>STATUS </b></td>' +
'<td align=center><b>QUANTIDADE </b></td>'
select @tabelabody =
(
SELECT
[status] as td,
COUNT(*) as td
FROM tabela
GROUP BY STATUS_MAILING
ORDER BY 1,2
FOR XML RAW('tr'), ELEMENTS
)
set @tabelahtml = @comeco+@html+@TABELAHTML+@TABELABODY+@fim
set @envio = @tabelahtml + '<p>Favor não responder à esse e-mail<br>Qualquer dúvida, contactar a equipe responsável.</p> '
SET @HTML = @COMECO+@BODY+@FIM
EXEC @EROS = MSDB.DBO.SP_SEND_DBMAIL
@PROFILE_NAME = 'EMAIL',
@RECIPIENTS = 'Fabiano <faabiianooc@gmail.com>',
@SUBJECT = @TITULO,
@BODY = @ENVIO,
@BODY_FORMAT = 'HTML'
Ao invés de Cursores, utilize o while:
http://adjuniordba.wordpress.com/2013/07/04/while-para-cursores/