<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Allan Rodrigues</title>
    <description>The latest articles on DEV Community by Allan Rodrigues (@sousallan).</description>
    <link>https://dev.to/sousallan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F398106%2F5f616ea2-34c2-4567-ae15-2f3398898d49.jpg</url>
      <title>DEV Community: Allan Rodrigues</title>
      <link>https://dev.to/sousallan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sousallan"/>
    <language>en</language>
    <item>
      <title>Unit Test em Stored Procedures (SQL Server) Parte II</title>
      <dc:creator>Allan Rodrigues</dc:creator>
      <pubDate>Tue, 09 Jun 2020 18:22:44 +0000</pubDate>
      <link>https://dev.to/sousallan/unit-test-em-stored-procedures-sql-server-parte-ii-ch0</link>
      <guid>https://dev.to/sousallan/unit-test-em-stored-procedures-sql-server-parte-ii-ch0</guid>
      <description>&lt;p&gt;E ai pessoal, como estamos? &lt;br&gt;
Dando continuidade a nossa sequencia de posts sobre Testes Unitários em Stored Procedures, dessa vez vamos ver como avaliar se o valor retornado da nossa sp está de acordo com o valor esperado. &lt;/p&gt;

&lt;p&gt;Vamos continuar usando nesse post: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visual Studio Data Tools 2017&lt;/li&gt;
&lt;li&gt;SQL Server 2016&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ainda utilizaremos a sp criada no post anterior, então se você perdeu a &lt;strong&gt;Parte 1&lt;/strong&gt; pode dar uma conferida aqui nesse &lt;a href="https://dev.to/sousallan/unit-test-em-stored-procedures-sql-server-parte-i-3jkf"&gt;LINK&lt;/a&gt;, beleza? &lt;/p&gt;

&lt;p&gt;Bom, essa parte é bem mais curta que a primeira visto que já fizemos todas as configurações básicas como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar a sp;&lt;/li&gt;
&lt;li&gt;Importar a sp para o nosso projeto;&lt;/li&gt;
&lt;li&gt;Configurar a conexão com a base de dados;&lt;/li&gt;
&lt;li&gt;Realizar o primeiro teste unitário&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então vamos lá..&lt;br&gt;
Para atingir o nosso objetivo que é verificar se o valor retornado da sp está correto, vamos criar uma nova unidade de teste. Então podemos clicar com o botão direito em cima da nossa sp e em "Create Unit Tests..."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8mdonvju4dj7i2hsbopo.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8mdonvju4dj7i2hsbopo.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Será exibida a tela acima, podemos configurar da seguinte forma: &lt;br&gt;
&lt;strong&gt;Em project:&lt;/strong&gt; Vamos deixar o nome do projeto que já havíamos criado. &lt;br&gt;
&lt;strong&gt;Create New Class:&lt;/strong&gt; vamos criar uma classe nova com o nome de UnitTestOperacao.cs (esse nome fica por sua conta).&lt;br&gt;
E em seguida podemos finalizar com o OK. &lt;/p&gt;

&lt;p&gt;Podemos observar agora em nosso Explorador de Soluções (Solutions Explorer) que uma nova unidade de teste foi criada: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpagpvmuedeyooop9n7d7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpagpvmuedeyooop9n7d7.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos ajustar agora o script de test que é gerado. &lt;br&gt;
Certifique-se que está alterando o script correto, observando o nome do arquivo que está aberto. &lt;br&gt;
Feito isso, faça as alterações devidas no script para que fique da forma como está abaixo: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwdsww2c99uxbdugu4fae.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwdsww2c99uxbdugu4fae.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De acordo com os inputs alterados queremos que seja realizado uma &lt;strong&gt;SOMA&lt;/strong&gt; entre 2 + 2 e que o resultado seja 4. &lt;/p&gt;

&lt;p&gt;Agora vamos alterar nossas condições de teste. &lt;br&gt;
Na parte inferior remova o teste inconclusivo. E adicione a condição &lt;strong&gt;SCALAR VALUE&lt;/strong&gt;, após adicionar essa condição aperte F4 para acessar as propriedades e em &lt;strong&gt;EXPECTED VALUE&lt;/strong&gt; vamos colocar o valor 4. Com isso, o nosso teste espera que a SOMA entre 2+2 seja 4. &lt;/p&gt;

&lt;p&gt;Adicionando a condição &lt;strong&gt;SCALAR VALUE&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6rptx4c9adfxvo7aqev6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6rptx4c9adfxvo7aqev6.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ajustando a propriedade &lt;strong&gt;EXPECTED VALUE&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4pbrwkgbd1bjm30rgf0l.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4pbrwkgbd1bjm30rgf0l.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao concluir as alterações, salve a solução e observe na janela "Gerenciador de Testes" que a nossa nova unidade está disponível. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2xmvq9hpwwq1ik1tkffv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2xmvq9hpwwq1ik1tkffv.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalmente podemos colocar o nosso teste pra rodar. &lt;/p&gt;

&lt;p&gt;Clique com o botão direito em cima da unidade criada e em "Executar Testes Selecionados"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwkk43dwot303gpdtotwr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwkk43dwot303gpdtotwr.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voilà! Nosso teste executado com sucesso... afinal de contas 2+2 ainda é 4. &lt;/p&gt;

&lt;p&gt;Agora vamos mudar o valor de qualquer input para que o valor da soma seja diferente de 4. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvjc182rt18y809t3dtcw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvjc182rt18y809t3dtcw.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alterando o script como acima o resultado da soma será 3, o que é diferente de 4. Então nosso teste deverá apresentar erro. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl9mmed7i23i0y6ub08gh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl9mmed7i23i0y6ub08gh.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E como esperado o teste retornou um erro, alertando que os valores são diferentes, o resultado 3 não coincide com o valor 4 esperado. &lt;/p&gt;

&lt;p&gt;E assim concluímos a segunda parte do nosso post de Unit Test em Stored Procedures. &lt;br&gt;
Sugiro, que vocês brinquem com os valores e operações para visualizar o comportamento do teste. &lt;/p&gt;

&lt;p&gt;Até a próxima, onde falaremos sobre testes negativos e encerraremos essa sequência de posts. &lt;/p&gt;

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Unit Test em Stored Procedures (Sql Server) Parte I</title>
      <dc:creator>Allan Rodrigues</dc:creator>
      <pubDate>Tue, 09 Jun 2020 03:07:20 +0000</pubDate>
      <link>https://dev.to/sousallan/unit-test-em-stored-procedures-sql-server-parte-i-3jkf</link>
      <guid>https://dev.to/sousallan/unit-test-em-stored-procedures-sql-server-parte-i-3jkf</guid>
      <description>&lt;p&gt;Atualmente temos acompanhado o mercado e visto muitas vagas de emprego que pedem ao desenvolvedor habilidades em construir testes unitários e conhecimento de ferramentas para aplicar testes front-end. &lt;br&gt;
Porém pouco, ou nem isso, lembramos de criar rotinas para testes em nossas procedures, não é mesmo? Apenas algumas execuções simples e uma conferida rápida no resultado. &lt;br&gt;
Se identificou, né? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3TEHa_ko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v8tzzm67nmsz9qvpefq6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3TEHa_ko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v8tzzm67nmsz9qvpefq6.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então devido essa realidade que tenho visto nos meus dias de trabalho resolvi começar a aplicar em meu dia-a-dia(sim, eu também não fazia) e compartilhar para quem se interessar em uma forma de realizar testes em suas procedures criadas no SQL Server. E ai meu velho? Vamo lá? &lt;/p&gt;

&lt;p&gt;Nesse exemplo eu usei: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visual Studio Data Tools 2017&lt;/li&gt;
&lt;li&gt;SQL Server 2016&lt;/li&gt;
&lt;li&gt;Banco de Dados de Estudo: WorldWideImporters&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  MÃOS NA MASSA!!!!
&lt;/h2&gt;

&lt;p&gt;Primeiro vamos criar nossa procedure que será o objeto de teste. Uma procedure simples que realiza operações matemáticas e retorna um resultado. &lt;br&gt;
Obs: Salve o script da procedure, pois será necessário mais a frente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m3w6Iwav--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9sshbicyjn43hmws3x46.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m3w6Iwav--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9sshbicyjn43hmws3x46.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois da compilação da procedure vamos para o VS Data Tool 2017. &lt;br&gt;
Com o VS aberto criamos um novo projeto, e em templates ou instalados buscamos por &lt;strong&gt;SQL Server Database Project&lt;/strong&gt;. &lt;br&gt;
Em seguida damos um nome ao projeto/solução e OK. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m7xHKIk3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y2yc91dp09xew9w0q4ry.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m7xHKIk3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y2yc91dp09xew9w0q4ry.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após criado a solução, vamos em Projeto &amp;gt; Importar &amp;gt; Script (*.sql).&lt;br&gt;
Lembra da procedure que foi criada lá no início? Pois é vamos importar agora para o nosso projeto. Seguindo a sequência de imagens a seguir.&lt;/p&gt;

&lt;p&gt;1 - Selecione o arquivo do script .sql que foi salvo em alguma pasta do seu computador: &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W9QnK7vt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rv90frcxmylmhb86lb2h.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W9QnK7vt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rv90frcxmylmhb86lb2h.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2 - Deixe nas opções padrões mesmo (eu não altero): &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ybSVIjn4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yfuis9rz2mq4fcw7rfkn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ybSVIjn4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yfuis9rz2mq4fcw7rfkn.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - O Visual Studio mostrará o progresso de importação.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9mFoWbfg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ihgo2e6c3o5ujcps9twb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9mFoWbfg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ihgo2e6c3o5ujcps9twb.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 - E.... &lt;em&gt;Voilà&lt;/em&gt;! O seu objeto foi importado e aparecerá no Object Explorer abaixo:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JirHoC0a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4kv76xwchilj6nr1a8i4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JirHoC0a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4kv76xwchilj6nr1a8i4.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso, clique com o botão direito em cima do objeto importado e então em "Criar Teste Unitário... (Create Unit Test...)"&lt;/p&gt;

&lt;p&gt;Em seguida abrirá uma janela modal para configurar a conexão com o banco de dados, informe o seu servidor, usuário e senha de forma padrão na aba &lt;em&gt;browse&lt;/em&gt; e clique em OK. &lt;/p&gt;

&lt;p&gt;Assim concluímos mais um passo!!! UFA! Muita coisa, ne? Porém ainda temos um caminho pela frente.. siga firme!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xZHZhPkG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nbwtk2f3wdnr68u0g47f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xZHZhPkG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nbwtk2f3wdnr68u0g47f.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Retomando....&lt;br&gt;
Após criarmos a nossa conexão o Visual Studio nos mostrará uma tela com um script de chamada da procedure de teste, e no combobox superior esquerdo o objeto que está será testado e no combobox da direita nos dá três opções que são executadas na sequência:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-test:&lt;/strong&gt;(OPCIONAL) Nessa área podemos criar scripts de preparação de ambiente, como por exemplo create, inserts de dados necessários para o funcionamento da rotina. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test:&lt;/strong&gt;(OBRIGATÓRIO) Aqui será feito o script de teste mesmo. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pos-Test:&lt;/strong&gt;(OPCIONAL) Pode ser usado para limpar os dados utilizados durante o teste. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EwHGfzih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ansas71gc1sr6i180mgv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EwHGfzih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ansas71gc1sr6i180mgv.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa mesma tela vamos remover o teste inconclusivo que aparece na parte inferior..&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vGXqkW7C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gmpkr3g94rd0mby9kqo2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vGXqkW7C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gmpkr3g94rd0mby9kqo2.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E então vamos criar uma validação de teste bem simples! Apenas pra verificar se a procedure está retornando dados da operação informada. &lt;br&gt;
Pra isso na mesma área onde removemos o teste inconclusivo, vamos incluir uma condição de teste. &lt;br&gt;
Escolha no combobox a opção "Row Count" e então adicione. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WmQqf-RD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ywnseky9q87geau16ztb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WmQqf-RD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ywnseky9q87geau16ztb.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na sequencia, clique em cima da linha e pressione F4 para acessar as propriedades do teste e altere o valor de "ROW COUNT" de 0 para 1 e salve tudo.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WAttR_kD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8orh644zxx654uq3wube.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WAttR_kD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8orh644zxx654uq3wube.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando salvar tudo da solução, na aba de "Gerenciamento de Teste" irá aparecer o teste nós criamos, como na imagem abaixo: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ViwbHHSb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0e84kcn80u9clfqr4n5q.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ViwbHHSb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0e84kcn80u9clfqr4n5q.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E então vamos rodar o nosso teste!!!! &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kJCRfdx9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d0kq8dy7b70ywxh791td.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kJCRfdx9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d0kq8dy7b70ywxh791td.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PRONTINHO!!&lt;br&gt;
TESTE EXECUTADO COM SUCESSO. &lt;/p&gt;

&lt;p&gt;Alteramos os parâmetros para valores válidos e executamos a rotina, parece meio demorado não é? Mas não é não e vale muito a pena, principalmente se você tem que documentar os resultados do teste. &lt;br&gt;
Neste primeiro post de 3, fizemos o caso de sucesso. &lt;br&gt;
No próximo vamos verificar o valor esperado e o último o teste negativo. &lt;/p&gt;

&lt;p&gt;Até a próxima meus amigos. &lt;/p&gt;

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Simulando a cláusula MERGE em uma Stored Procedure Compilada Nativamente. </title>
      <dc:creator>Allan Rodrigues</dc:creator>
      <pubDate>Sun, 07 Jun 2020 04:33:42 +0000</pubDate>
      <link>https://dev.to/sousallan/simulando-a-clausula-merge-em-uma-stored-procedure-compilada-nativamente-50cj</link>
      <guid>https://dev.to/sousallan/simulando-a-clausula-merge-em-uma-stored-procedure-compilada-nativamente-50cj</guid>
      <description>&lt;h2&gt;
  
  
  O que é uma Stored Procedure Compilada Nativamente?
&lt;/h2&gt;

&lt;p&gt;Em resumo SP's compiladas nativamente são procedures compiladas para código de máquina gerando uma DLL e carregando a mesma para o In-Memory OLTP Runtime e é usada para acessar tabelas otimizadas em memória.&lt;br&gt;
Mais detalhes sobre esse tipo de SP você pode encontrar &lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/a-guide-to-query-processing-for-memory-optimized-tables?view=sql-server-ver15#:~:text=Natively%20Compiled%20Stored%20Procedures,by%20the%20query%20execution%20engine."&gt;&lt;strong&gt;AQUI&lt;/strong&gt;&lt;/a&gt; . &lt;/p&gt;

&lt;p&gt;Mas esse tipo de procedure possui limitações e uma delas é a utilização do comando &lt;strong&gt;MERGE&lt;/strong&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  O que é o T-SQL MERGE?
&lt;/h4&gt;

&lt;p&gt;Com o comando &lt;strong&gt;MERGE&lt;/strong&gt; é possível realizar INSERT, UPDATE, DELETE na mesma instrução de acordo com a validação dos dados entre as tabelas origem e destino. &lt;br&gt;
Abaixo a utilização do MERGE: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1Obzn3N2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s0o0zc2fjr6dhne09udi.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Obzn3N2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s0o0zc2fjr6dhne09udi.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas como usar uma instrução tão poderosa em procedures compiladas nativamente? Segue abaixo um script equivalente, um &lt;em&gt;workaround&lt;/em&gt; para isso. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Criamos uma tabela e um tipo&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wP38kEWs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xz5mi6h4rarg9ogo6125.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wP38kEWs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xz5mi6h4rarg9ogo6125.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Script de criação da procedure que fará o Merge&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sRDyNmCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jxz02irjcbwkj7n0awfw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sRDyNmCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jxz02irjcbwkj7n0awfw.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois é só declarar uma váriavel do tipo que foi criado, inserir alguns valores e passar para procedure como parametro para testar. &lt;/p&gt;

&lt;p&gt;Prontinho! &lt;/p&gt;

&lt;p&gt;Temos uma procedure compilada nativamente que simula a execução do comando &lt;strong&gt;merge&lt;/strong&gt; :D &lt;/p&gt;

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Gerando um totalizador acumulado por linha sem usar cursor. </title>
      <dc:creator>Allan Rodrigues</dc:creator>
      <pubDate>Fri, 05 Jun 2020 21:42:02 +0000</pubDate>
      <link>https://dev.to/sousallan/gerando-um-totalizador-acumulado-por-linha-sem-usar-cursor-4047</link>
      <guid>https://dev.to/sousallan/gerando-um-totalizador-acumulado-por-linha-sem-usar-cursor-4047</guid>
      <description>&lt;p&gt;Olá pessoas!!!&lt;br&gt;
Acredito que assim como eu vocês já se depararam com situações nas quais precisavam gerar um total que vai se acumulando linha a linha, não é mesmo? &lt;br&gt;
E quando geramos consultas pra relatórios acabamos usando o famoso &lt;strong&gt;cursor&lt;/strong&gt; para gerar esses totalizadores, o que acaba não sendo tão performático assim. &lt;br&gt;
Dessa forma resolvi mostrar aqui como podemos gerar esse tipo de totalizador usando &lt;em&gt;Window Function&lt;/em&gt;, no T-SQL. &lt;/p&gt;

&lt;p&gt;Pra montar esse exemplo eu usei: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SQL SERVER 2016 Developer &lt;/li&gt;
&lt;li&gt;SSMS&lt;/li&gt;
&lt;li&gt;Banco de dados de estudo &lt;em&gt;WorldWideImporters&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de metermos a mão na massa, vocês tão ligados do que são as &lt;em&gt;Window Function&lt;/em&gt;? &lt;br&gt;
&lt;em&gt;Window Function&lt;/em&gt; são funções nas quais podemos utilizar para realizar cálculos ou agregações em um conjunto de linhas que possuem alguma relação, nesse caso não precisamos utilizar o GROUP BY. E torna muito útil pois na mesma consulta podemos ter um resultado analítico e sintético. A sua utilização é bem simples. &lt;/p&gt;

&lt;p&gt;Nesse &lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver15"&gt;Link&lt;/a&gt; da documentação da Microsoft tem um detalhamento melhor sobre Window Function. Pois não é o caso aqui entrar em muito detalhe apenas vamos abordar um caso específico, lá você pode abrir a sua mente e viajar em possíveis soluções... &lt;/p&gt;

&lt;h3&gt;
  
  
  Hora de botar a mão na massa!!!!
&lt;/h3&gt;

&lt;p&gt;No cenário em questão vamos imaginar que foi feito uma solicitação para você gerar uma consulta que mostre o ID do pedido, ID do Cliente, Data do Pedido, Descrição do pedido, Quantidade, Valor Unitário, Total Geral do pedido e um Total Acumulativo por pedido. &lt;br&gt;
Abaixo nos tempos os Script para atender essa solicitação. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U3okrp3V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1sknc33ivzf4nfvps22d.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U3okrp3V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1sknc33ivzf4nfvps22d.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na linha na qual geramos o total geral: &lt;br&gt;
SUM(OL.UnitPrice * Quantity) OVER(PARTITION BY OL.OrderId) AS Total&lt;/p&gt;

&lt;p&gt;Usamos a Window Function OVER() gerando uma partição com o PARTITION BY e com isso podemos somar os registros referente a um determinado ID sem precisar usar o GROUP BY. &lt;/p&gt;

&lt;p&gt;Na linha na qual geramos o total corrente: &lt;br&gt;
SUM(OL.UnitPrice * Quantity) OVER(PARTITION BY OL.OrderID ORDER BY OL.OrderID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS Total_Corrente &lt;/p&gt;

&lt;p&gt;De forma semelhante ao total geral também criamos uma partição com o PARTITION BY para ele gerar o total corrente por ID do pedido, porém acrescentamos um ORDER BY que é obrigatório quando utilizamos &lt;strong&gt;UNBOUNDED PRECEDING&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UNBOUNDED PRECEDING&lt;/strong&gt; indica que a Window Function irá começar da primeira linha da partição. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CURRENTE ROW&lt;/strong&gt; indica que é até a linha corrente. &lt;/p&gt;

&lt;p&gt;Então &lt;strong&gt;ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW&lt;/strong&gt;, seria as lihas entre o início da partição e a linha corrente. Com isso podemos ir gerando o total por linha da partição. &lt;/p&gt;

&lt;p&gt;Abaixo o resultado da nossa consulta. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xaQvTW_5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fgur2ee04q7sbc9duvrq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xaQvTW_5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fgur2ee04q7sbc9duvrq.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então é isso pessoal, espero que isso seja útil pra vocês. :D&lt;/p&gt;

</description>
      <category>sql</category>
    </item>
    <item>
      <title>French Amortization Method (PRICE) with T-SQL.</title>
      <dc:creator>Allan Rodrigues</dc:creator>
      <pubDate>Fri, 29 May 2020 22:42:28 +0000</pubDate>
      <link>https://dev.to/sousallan/french-amortization-method-price-with-t-sql-1ap5</link>
      <guid>https://dev.to/sousallan/french-amortization-method-price-with-t-sql-1ap5</guid>
      <description>&lt;h2&gt;
  
  
  What is FRENCH AMORTIZATION METHOD? (Also known as PRICE)
&lt;/h2&gt;

&lt;p&gt;The amortization by the &lt;strong&gt;French method, progressive or classic&lt;/strong&gt;, is characterized by the payment of overdue interest, that is to say, at the end of each payment, and payment of constant instalments in each period.&lt;br&gt;
Interest decreases as loan periods pass and amortized capital increases in evey new period.&lt;br&gt;
The follow image contains the formula to calculate a banking loan. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0nn36mz5hm21fpzgyl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0nn36mz5hm21fpzgyl8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mês = Month;&lt;br&gt;
Prestação = Payment;&lt;br&gt;
Juros = Interest;&lt;br&gt;
Amortização = Amount amortized;&lt;br&gt;
SD (Saldo Devedor) = Fixed Amount. &lt;/p&gt;

&lt;h2&gt;
  
  
  Translate to Transact SQL
&lt;/h2&gt;

&lt;p&gt;You can download the script &lt;strong&gt;SQL_CALCULAR_PRICE.sql&lt;/strong&gt; on my &lt;a href="https://github.com/sousallan/Projetos" rel="noopener noreferrer"&gt;Github&lt;/a&gt;, to analyze how to calculate PRICE using T-SQL. Follow the link:&lt;/p&gt;

</description>
      <category>sql</category>
      <category>tsql</category>
      <category>price</category>
    </item>
  </channel>
</rss>
