<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Virtual PASS BR on Brain (Hugo + Obsidian)</title><link>https://blog.merazzi.com.br/categories/virtual-pass-br/</link><description>Recent content in Virtual PASS BR on Brain (Hugo + Obsidian)</description><generator>Hugo -- 0.147.1</generator><language>pt-br</language><lastBuildDate>Tue, 12 Nov 2019 04:47:51 +0000</lastBuildDate><atom:link href="https://blog.merazzi.com.br/categories/virtual-pass-br/index.xml" rel="self" type="application/rss+xml"/><item><title>Separar texto com ‘;’ em ‘n’ colunas</title><link>https://blog.merazzi.com.br/posts/2019/11/separar-texto-com-em-n-colunas/</link><pubDate>Tue, 12 Nov 2019 04:47:51 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2019/11/separar-texto-com-em-n-colunas/</guid><description>&lt;p>E aí pessoal, tudo belezinha com vocês? Segue um post rápido, só para registrar um assunto que rolou em um grupo de discussão do Telegram há algum tempo atrás e só agora eu resolvi parar para escrever a respeito…&lt;/p>
&lt;p>Pense no seguinte cenário:&lt;/p>
&lt;p>Eu tenho uma tabela onde uma das colunas é um campo texto (varchar(XXX)), separado por ‘;’ (ou qualquer outro caractere de sua preferência).&lt;/p>
&lt;p>Mas porque eu teria isso? Bom, imagine que você crie uma trigger para a fazer sua auditoria e, ao invés de guardar em colunas, você guarda em um varchar as alterações…&lt;/p></description></item><item><title>SQL Saturday Caxias do Sul 2019 #SQLSat834</title><link>https://blog.merazzi.com.br/posts/2019/06/sql-saturday-caxias-do-sul-2019-%23sqlsat834/</link><pubDate>Wed, 26 Jun 2019 04:53:51 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2019/06/sql-saturday-caxias-do-sul-2019-%23sqlsat834/</guid><description>&lt;p>Antes tarde do que mais tarde, né…&lt;/p>
&lt;p>E já adianto, esse vai ser um post bem no &lt;em>hype&lt;/em> do evento ainda, então vai ter elogios para todos os lados… 🙂&lt;/p>
&lt;p>No dia 22/06 foi realizada mais uma edição do &lt;a href="https://www.sqlsaturday.com/834/EventHome.aspx" target="_blank" rel="noopener">SQL Saturday, em Caxias do Sul&lt;/a>. Fui em todas as edições realizadas e essa foi a minha segunda vez como palestrante.&lt;br>
A primeira palavra que eu usaria para descrever o evento é impublicável, então vamos com a segunda: **Fantástico!&lt;br>
** Cheguei na sexta-feira, onde, pela primeira vez, participei de um &lt;em>speakers dinner&lt;/em>. Sentar à mesa com alguns dos profissionais mais relevantes da comunidade, trocar ideias, dar umas boas risadas é algo indescritível. De verdade.&lt;br>
Agora, sobre o evento…&lt;br>
A atenção dos organizadores e das pessoas que apoiaram durante todo o dia – incansavelmente – é um caso à parte. Todo o esforço e o cuidado para que todos nós nos sentíssemos realmente em casa (palestrantes e quem estava assistindo), e pudéssemos aproveitar ao máximo o dia, foi realmente admirável.&lt;/p></description></item><item><title>SSIS: Script task para envio de e-mail</title><link>https://blog.merazzi.com.br/posts/2019/01/ssis-script-task-para-envio-de-e-mail/</link><pubDate>Thu, 03 Jan 2019 16:52:19 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2019/01/ssis-script-task-para-envio-de-e-mail/</guid><description>&lt;p>Primeiro post de 2019 e, surpreendentemente, não são as minhas metas para 2019, nem é sobre SQL Server…&lt;/p>
&lt;p>Esse post surgiu motivado por uma pergunta que apareceu no dia 27/12, num dos grupos de WhatsApp que participo.&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://blog.merazzi.com.br/images/2019/01/ScriptTask_Duvida.png">&lt;/p>
&lt;p>A moral da história é que eu tenho, mas achei tão trivial a solução, que não achei que seria interessante um post sobre isso (lição aprendida). E como estava fora do PC, não tinha nem como ajudar o colega direito. Mas, agora, fica o registro.&lt;/p></description></item><item><title>70-778: Minha primeira prova de certificação Beta (e seu resultado, finalmente)</title><link>https://blog.merazzi.com.br/posts/2018/01/70-778-minha-primeira-prova-de-certifica%C3%A7%C3%A3o-beta-e-seu-resultado-finalmente/</link><pubDate>Wed, 17 Jan 2018 02:09:01 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2018/01/70-778-minha-primeira-prova-de-certifica%C3%A7%C3%A3o-beta-e-seu-resultado-finalmente/</guid><description>&lt;p>2018 começou com tudo!&lt;/p>
&lt;p>Em setembro do ano passado, divulgaram que a Microsoft estava com vouchers para a realização das provas de Power BI (e outros produtos), ainda em versão Beta.&lt;br>
As provas Beta, são provas que ainda estão passando por uma avaliação da Microsoft no que tange a qualidade das questões (descrições, opções, métodos de escolha, etc), mas que é a base para a prova oficial, quando ela for lançada para o público geral.&lt;br>
Quando eles divulgam as provas, apenas 300 vagas são disponibilizadas **no mundo todo **(essa parte é muito importante frisar, heheeh) e quem conseguir reservar primeiro, será beneficiado.&lt;br>
No final da prova, você precisa deixar os teus comentários sobre as questões, para que eles possam fazer a triagem e ver o que precisa ser refeito. Dizem que o processo todo pode levar até 8 semanas, até que se tenha o resultado da prova. Todo o processo é bem explicado nesse post, sugiro a leitura para maiores informações: &lt;a href="https://borntolearn.mslearn.net/b/weblog/posts/the-path-from-beta-exam-to-live-exam" target="_blank" rel="noopener">https://borntolearn.mslearn.net/b/weblog/posts/the-path-from-beta-exam-to-live-exam&lt;/a>&lt;br>
Enfim, a minha prova foi no dia 15/09 (&lt;em>70-778: Analyzing and Visualizing Data with Power BI (beta)&lt;/em>) e devo confessar que saí de lá com esperança de ter passado, mas não com “aquela” convicção.&lt;br>
A prova em si, foi uma prova como as outras (eu estava esperando uma prova bem diferente, não sei pq)… Mas ela estava bem detalhada em alguns pontos e mais aberta em outros. Eu curti bastante fazer. E pensar que os comentários feitos nas questões podem ajudar no rumo da prova oficial, me deixou bem animado.&lt;br>
O problema todo foram essas 8 semanas, que, pra quem fez a prova comigo, acabou em uma espera de exatos &lt;strong>4 meses&lt;/strong>!!!&lt;br>
Ah, o resultado? **APROVADO!!!! 😀&lt;br>
** Acho que de todo o processo… A reserva, a prova e toda a espera… O mais legal com esse resultado é pensar que eu sou uma das &lt;strong>primeiras 300 pessoas certificadas em Power BI no mundo!&lt;/strong>&lt;br>
Para esse ano, eu quero fazer pelo menos duas provas de SQL 2016 e uma de Azure, vamos ver como as coisas vão se encaminhar.&lt;/p></description></item><item><title>Identificando o uso de objetos ‘deprecated’ na sua instância.</title><link>https://blog.merazzi.com.br/posts/2017/08/identificando-o-uso-de-objetos-deprecated-na-sua-inst%C3%A2ncia./</link><pubDate>Thu, 31 Aug 2017 17:08:59 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2017/08/identificando-o-uso-de-objetos-deprecated-na-sua-inst%C3%A2ncia./</guid><description>&lt;p>Quick tip!&lt;/p>
&lt;p>A cada nova versão do SQL Server, novos recursos são adicionados e, claro, alguns são removidos ou marcados para futura exclusão (&lt;em>deprecated&lt;/em>). O último caso ocorre para que todos tenham tempo para validar e ajustar suas aplicações, afinal, ninguém aqui é doido de aplicar uma nova versão do SQL Server em produção sem validar se a aplicação está rodando adequadamente, né!? &lt;strong>NÉ!?!?&lt;/strong> 🙂&lt;/p>
&lt;p>Ok, mas como saber se você está usando um recurso na sua instância que está marcado como &lt;em>deprecated&lt;/em>?&lt;/p></description></item><item><title>#WTF: “The UserLog directory in the registry is not valid.”</title><link>https://blog.merazzi.com.br/posts/2016/08/%23wtf-the-userlog-directory-in-the-registry-is-not-valid./</link><pubDate>Tue, 09 Aug 2016 15:26:16 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2016/08/%23wtf-the-userlog-directory-in-the-registry-is-not-valid./</guid><description>&lt;p>Essa entra pra série #WTF (Vivendo e aprendendo).&lt;/p>
&lt;p>Ao instalar o Full Text Search em um dos nossos servidores, me deparei com o warning a seguir:&lt;/p>
&lt;figure id="attachment_470" aria-describedby="caption-attachment-470" style="width: 619px" class="wp-caption aligncenter">![](/images/2016/08/ERRO1.png)&lt;figcaption id="caption-attachment-470" class="wp-caption-text">What!?&lt;/figcaption>&lt;/figure>
&lt;blockquote>
&lt;p>The User Log directory in the registry is not valid. Verify DefaultLog Key under the instance hive points to a valid directory&lt;/p>&lt;/blockquote></description></item><item><title>Restaurando um banco apenas com o .mdf</title><link>https://blog.merazzi.com.br/posts/2016/05/restaurando-um-banco-apenas-com-o-.mdf/</link><pubDate>Tue, 24 May 2016 19:30:24 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2016/05/restaurando-um-banco-apenas-com-o-.mdf/</guid><description>&lt;p>Surgiu uma solicitação para eu restaurar um banco. Até aí, tudo ok, é um processo normal. RESTORE DATABASE Blábláblá, permissões dadas e assunto encerrado.&lt;br>
Ao ver o arquivo, havia apenas um .mdf. Ou seja, não é mais um restore, é um ATTACH. Seria outro processo normal também… Se existissem os arquivos de log (.ldf).&lt;/p>
&lt;p>Ao tentar restaurar, o seguinte erro surgiu:&lt;/p>
&lt;blockquote>
&lt;p>File activation failure. The physical file name “C:\Caminho\Original\do\banco\arquivo_log.LDF” may be incorrect.&lt;/p>
&lt;p>The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.&lt;/p>&lt;/blockquote>
&lt;p>Mas vamos lá, passo a passo, para vermos os problemas que podem aparecer e como resolver.&lt;/p></description></item><item><title>Acessando um banco MySQL pelo SQL Server via Linked Server</title><link>https://blog.merazzi.com.br/posts/2015/11/acessando-um-banco-mysql-pelo-sql-server-via-linked-server/</link><pubDate>Mon, 16 Nov 2015 15:06:51 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/11/acessando-um-banco-mysql-pelo-sql-server-via-linked-server/</guid><description>&lt;p>Surgiu uma demanda onde era necessário migrar algumas tabelas de alguns bancos em MySQL para dentro do SQL Server e tínhamos disponível apenas o backup (a.k.a. &lt;em>dump&lt;/em>) dos bancos de origem.&lt;/p>
&lt;p>Realizar o tratamento do arquivo (manualmente) para que fosse possível criar os bancos e inserir os dados estava fora de cogitação. Como temos uma VM com o Linux (Ubuntu) e com o MySQL instalado, optei por realizar a criação de um Linked Server entre os dois servidores.&lt;/p></description></item><item><title>Tratamento de Exceções. Parte 2</title><link>https://blog.merazzi.com.br/posts/2015/11/tratamento-de-exce%C3%A7%C3%B5es.-parte-2/</link><pubDate>Tue, 10 Nov 2015 14:05:12 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/11/tratamento-de-exce%C3%A7%C3%B5es.-parte-2/</guid><description>&lt;p>Essa é a parte 2 de uma série de 3 posts (ou 4, quem sabe), onde eu quero falar sobre as formas de realizar o tratamento de exceções no SQL Server.&lt;/p>
&lt;p>Se você caiu aqui por acaso, sugiro antes dar uma olhada na &lt;a href="http://blog.merazzi.eti.br/?p=390" target="_blank" rel="noopener">parte 1 da série&lt;/a>, onde eu trato de alguns detalhes no que diz respeito à forma que o SQL Server realiza o encerramento de processos, nos casos de erro.&lt;/p>
&lt;p>Hoje irei falar sobre como realizar o tratamento de exceções, via &lt;em>TRY / CATCH&lt;/em>.&lt;/p></description></item><item><title>Introdução ao tratamento de Exceções</title><link>https://blog.merazzi.com.br/posts/2015/11/introdu%C3%A7%C3%A3o-ao-tratamento-de-exce%C3%A7%C3%B5es/</link><pubDate>Tue, 03 Nov 2015 14:00:18 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/11/introdu%C3%A7%C3%A3o-ao-tratamento-de-exce%C3%A7%C3%B5es/</guid><description>&lt;p>O seu código vai dar erro. Isso é um fato. Mesmo que seja a pessoa mais cuidadosa do mundo, você tem que preparar o seu código para o pior: O bug! Até porque no momento que os erros aparecerem, você vai precisar verificar o que está ocorrendo e ajustar da forma mais rápida possível.&lt;br>
E tem outra: Ninguém gosta de rodar uma aplicação e dar de cara com uma tela exibindo o &lt;em>stack&lt;/em> do erro.&lt;br>
E para isso, você deve tratar as exceções que o teu código pode gerar.&lt;/p>
&lt;p>Mas antes de entrar no assunto de tratamento de erros, primeiramente, gostaria de alinhar algumas ideias…&lt;/p>
&lt;p>Esse será o primeiro de uma série de 2 ou 3 posts, veremos como ficará o próximo, pois este já ficou consideravelmente grande.&lt;/p></description></item><item><title>Alterando o schema de objetos em lote</title><link>https://blog.merazzi.com.br/posts/2015/10/alterando-o-schema-de-objetos-em-lote/</link><pubDate>Wed, 28 Oct 2015 03:00:34 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/10/alterando-o-schema-de-objetos-em-lote/</guid><description>&lt;p>Não vou entrar aqui no mérito do que são os &lt;em>schemas&lt;/em> e como especificamos (deixemos isso para um outro momento).&lt;br>
Quero apenas deixar o seguinte cenário:&lt;br>
Um usuário criou uma série de scripts e, ao aplicá-lo no banco, todos os objetos ficaram com o nome do usuário no &lt;em>schema&lt;/em>: &lt;em>usuário.procedure, usuario.function, usuario.table&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>&lt;em>Como ajustar isso, sem que seja necessário abrir cada objeto individualmente e colocar no&lt;/em> schema &lt;em>correto (vamos usar o&lt;/em> schema &lt;em>dbo aqui, para simplificar as coisas)?&lt;/em>&lt;/p>&lt;/blockquote></description></item><item><title>Renomeando um Profile ou Account Name (Database Mail)</title><link>https://blog.merazzi.com.br/posts/2015/10/renomeando-um-profile-ou-account-name-database-mail/</link><pubDate>Thu, 01 Oct 2015 18:35:19 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/10/renomeando-um-profile-ou-account-name-database-mail/</guid><description>&lt;p>Muito provavelmente, para utilizar o Database Mail dentro do SQL Server você utilizou a interface gráfica…&lt;/p>
&lt;p>Criou o profile, a conta, ativou como público (né, fala a verdade…) e manteve as opções padrão.&lt;/p>
&lt;p>Os e-mails estão sendo enviados normalmente, até que surge a necessidade de criar um outro profile. Como o nome ficou parecido, você resolve ir nas configurações do database mail e mudar o nome do profile anterior:&lt;br>
Botão direito em &lt;em>Database Mail&lt;/em> -&amp;gt; &lt;em>Configure Database Mail&lt;/em> -&amp;gt; &lt;em>View, Change, or delete an existing Profile&lt;/em>, seleciona o profile desejado e… &lt;a href="http://sadtrombone.com/" target="_blank" rel="noopener">fuéfuéfué&lt;/a>… Como altera o nome?&lt;/p></description></item><item><title>“Login failed for user ‘NT Authority\ANONYMOUS LOGON’ ” ao criar um Linked Server</title><link>https://blog.merazzi.com.br/posts/2015/07/login-failed-for-user-nt-authority%5Canonymous-logon-ao-criar-um-linked-server/</link><pubDate>Fri, 31 Jul 2015 20:02:05 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/07/login-failed-for-user-nt-authority%5Canonymous-logon-ao-criar-um-linked-server/</guid><description>&lt;p>Ao criar um &lt;em>Linked Server&lt;/em> entre dois servidores com SQL Server 2008, via &lt;em>Windows Authentication,&lt;/em> me deparei com o erro abaixo:&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://blog.merazzi.com.br/images/2015/07/Post_LnkSrvr1.png">&lt;/p>
&lt;p>Dando uma &lt;del>Googleada&lt;/del> investigada, li que poderia ser por causa da delegação via Kerberos não estar funcionando. O nome do “cara”: &lt;strong>Kerberos constrained delegation.&lt;/strong>&lt;/p></description></item><item><title>Usando o Some | Any | All</title><link>https://blog.merazzi.com.br/posts/2015/07/usando-o-some-any-all/</link><pubDate>Fri, 10 Jul 2015 14:02:49 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/07/usando-o-some-any-all/</guid><description>&lt;p>Olhando os operadores lógicos do SQL Server (&lt;a href="https://msdn.microsoft.com/pt-br/library/ms189773%28v=sql.120%29.aspx" target="_blank" rel="noopener">link&lt;/a>), me deparei com algo curioso, que até então não tinha visto: os operadores Some, Any e All que, vejam só, está disponível desde do SQL Server 2008. #facepalm&lt;/p>
&lt;p>O objetivo deles: Comparar um valor escalar (lembrem-se disso) com os valores de um dataset (a.k.a. subquery). O ALL validará se TODOS os valores do dataset correspondem ao valor comparado. O SOME e o ANY são equivalentes, eles retornaram TRUE se algum dos valores do dataset corresponder à comparação.&lt;br>
Se você ouviu um IN na explicação, pense nele como um IN com esteroides para um valor escalar, uma vez que você pode validar com os operadores =, &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, etc.&lt;/p></description></item><item><title>Escapando caracteres usando o ESCAPE</title><link>https://blog.merazzi.com.br/posts/2015/07/escapando-caracteres-usando-o-escape/</link><pubDate>Tue, 07 Jul 2015 16:11:59 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/07/escapando-caracteres-usando-o-escape/</guid><description>&lt;p>Pessoal, aproveitando para tirar um pouco a poeira, uma dica rápida que surgiu no trabalho hoje…&lt;/p>
&lt;p>Como sabemos (sabemos, né?), temos alguns caracteres que são chamados de coringas, para facilitar a busca por um padrão.&lt;br>
Não vou explicar aqui o que cada um faz, mas eles são: %, _ , [], [^]&lt;/p>
&lt;p>&lt;strong>O problema&lt;/strong>: Quero pesquisar na minha tabela por todas as linhas que comecem com [OK]. Porém, se eu fizer um simples &lt;em>WHERE Coluna like ‘[OK]%’&lt;/em> (um exemplo esdrúxulo, mas que mantém o fluxo do raciocínio), a consulta vai me retornar todas as linhas que comecem com O ou com K e o que houver mais nesse registro, o que não é bem o que queremos.&lt;/p></description></item><item><title>Dicionário de Dados – A Exclusão.</title><link>https://blog.merazzi.com.br/posts/2015/03/dicion%C3%A1rio-de-dados-a-exclus%C3%A3o./</link><pubDate>Thu, 19 Mar 2015 17:30:58 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/03/dicion%C3%A1rio-de-dados-a-exclus%C3%A3o./</guid><description>&lt;p>Um dos meus papéis dentro da empresa onde trabalho é o de &lt;del>ser chato e&lt;/del> verificar os scripts que são enviados antes de entrar em produção.&lt;/p>
&lt;p>Uma parte das verificações é garantir que o dicionário de dados esteja o mais atualizado possível para que consigamos entender o objetivos das tabelas, colunas, constraints, etc.&lt;/p>
&lt;p>Para inserir uma propriedade em um objeto, deve ser utilizada a procedure &lt;a href="http://msdn.microsoft.com/pt-br/library/ms180047.aspx" target="_blank" rel="noopener">sp_addextendedproperty&lt;/a>. Para remover: &lt;a href="http://msdn.microsoft.com/en-us/library/ms178595.aspx" target="_blank" rel="noopener">sp_dropextendedproperty&lt;/a>. E para atualizar: &lt;a href="http://msdn.microsoft.com/pt-br/library/ms186885.aspx" target="_blank" rel="noopener">sp_updateextendedproperty&lt;/a>. Não vou entrar no mérito de como usar, pois o BOL (Books On Line – RTFM!) explica bem como usar e os parâmetros necessários.&lt;/p></description></item><item><title>Powerview: Como ordenar uma coluna, que não seja por ordem alfabética.</title><link>https://blog.merazzi.com.br/posts/2014/11/powerview-como-ordenar-uma-coluna-que-n%C3%A3o-seja-por-ordem-alfab%C3%A9tica./</link><pubDate>Wed, 05 Nov 2014 11:45:09 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2014/11/powerview-como-ordenar-uma-coluna-que-n%C3%A3o-seja-por-ordem-alfab%C3%A9tica./</guid><description>&lt;p>Um dos desafios que tive recentemente (e bem básico, diga-se de passagem, para uma pessoa mais experiente), foi a necessidade de ordenar uma tabela, mas que não poderia seguir a ordem alfabética padrão do PowerView.&lt;/p>
&lt;p>Um exemplo clássico: Uma tabela  onde eu tenho os meses de um ano e eu preciso ordenar pelo nome do mês, mas seguindo a sequência dos meses (Jan, Fev, Mar, etc.).&lt;/p>
&lt;p>A questão: Se eu simplesmente ordenar pelo nome do mês, o resultado que eu vou obter será: Abril, Agosto, Dezembro, Fevereiro, Janeiro, Julho, Junho, Maio, Março, Novembro, Outubro, Setembro.&lt;/p></description></item><item><title>Qual o percentual de andamento do meu Backup / Restore?</title><link>https://blog.merazzi.com.br/posts/2014/06/qual-o-percentual-de-andamento-do-meu-backup-/-restore/</link><pubDate>Tue, 10 Jun 2014 13:01:59 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2014/06/qual-o-percentual-de-andamento-do-meu-backup-/-restore/</guid><description>&lt;p>Quando você executa um Backup / Restore pelo SSMS, você tem facilmente o percentual de andamento indo na aba “Messages”.&lt;br>
E quando você executa, por exemplo, via powershell e ele fica lá travado no processo e não te informa nada?&lt;br>
Nesses casos, você pode rodar a consulta abaixo:&lt;/p>
&lt;pre class="lang:tsql decode:true ">SELECT start_time, percent_complete, session_id, status, command
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )&lt;/pre>
&lt;p>Com isso, você saberá o percentual de execução do teu backup:&lt;br>
&lt;img loading="lazy" src="https://blog.merazzi.com.br/images/2014/06/tempo_backup-1.png">&lt;/p></description></item><item><title>Erro ao instalar o SQL Server Data Tools no Visual Studio 2012</title><link>https://blog.merazzi.com.br/posts/2014/03/erro-ao-instalar-o-sql-server-data-tools-no-visual-studio-2012/</link><pubDate>Sun, 23 Mar 2014 18:27:51 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2014/03/erro-ao-instalar-o-sql-server-data-tools-no-visual-studio-2012/</guid><description>&lt;p>Dica rápida: Ao instalar os &lt;a href="http://www.microsoft.com/pt-br/download/details.aspx?id=36843" target="_blank" rel="noopener">projetos de BI do SQL Server Data Tools no Visual Studio 2012&lt;/a>, apareceu o seguinte erro:&lt;/p>
&lt;blockquote>
&lt;pre>Rule "Same architecture installation" failed.&lt;/blockquote>
&lt;p>The CPU architecture of installing feature(s) is different than the instance specified. To continue, add features to this instance with the same architecture.&lt;/pre>&lt;/p>
&lt;p>O executável tem no nome o ‘x86’ então achei que eu tinha baixado o arquivo errado, mas na página diz que ele suporta a versão ‘x64’.&lt;/p></description></item><item><title>CROSS APPLY com FOR XML, dentro de um FOR XML</title><link>https://blog.merazzi.com.br/posts/2014/03/cross-apply-com-for-xml-dentro-de-um-for-xml/</link><pubDate>Wed, 19 Mar 2014 20:13:33 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2014/03/cross-apply-com-for-xml-dentro-de-um-for-xml/</guid><description>&lt;p>Esses dias surgiu uma questão aqui no trabalho que acho que vale o registro…&lt;/p>
&lt;p>Me questionaram sobre a possibilidade de concatenar o resultado de diversas linhas em uma única e, imediatamente, me veio o bom e velho FOR XML PATH(”) em mente.&lt;/p>
&lt;p>O problema é que o resultado deveria ser concatenado de acordo com o resultado proveniente de uma outra tabela, algo como:&lt;/p>
&lt;pre>Status1 (Codigo1, Codigo2, Codigo3) Status 2 (Codigo4) Status 3 (Codigo5)&lt;/pre>
&lt;p>A criação da estrutura seria algo assim:&lt;/p></description></item><item><title>Feliz Ano Novo em T-SQL!?!?</title><link>https://blog.merazzi.com.br/posts/2013/12/feliz-ano-novo-em-t-sql/</link><pubDate>Tue, 31 Dec 2013 03:06:36 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/12/feliz-ano-novo-em-t-sql/</guid><description>&lt;p>Bom, hoje dando uma brincada com dados geoespaciais (férias tem disso… hehehe), resolvi fazer uma “brincadeira” e desejar um Feliz Ano Novo de um jeito diferente…&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://blog.merazzi.com.br/images/2013/12/AnoNovoSQL-1.png">&lt;/p>
&lt;p>Claro, nada se compara ao Feliz Natal do &lt;a title="Merry Christmas" href="http://sqlblog.com/blogs/michael_coles/archive/2010/12/24/this-year-s-sql-christmas-card.aspx" target="_blank" rel="noopener">Michael Coles&lt;/a>, mas é como dizem: O que vale é a intenção… heheheh&lt;/p>
&lt;p>Espero que em 2014 todas as metas estipuladas sejam alcançadas, que seja um ano de renovação ou, pelo menos, de ação.&lt;/p>
&lt;p>Ah, claro… Para quem quiser ver o script, acesse o meu github: &lt;a href="https://github.com/LoganMerazzi/SQLServerScripts/blob/master/Happy%20new%20year" target="_blank" rel="noopener">https://github.com/LoganMerazzi/SQLServerScripts/blob/master/Happy%20new%20year&lt;/a>&lt;/p></description></item><item><title>Descobrindo quais tabelas estão em quais filegroups</title><link>https://blog.merazzi.com.br/posts/2013/10/descobrindo-quais-tabelas-est%C3%A3o-em-quais-filegroups/</link><pubDate>Wed, 23 Oct 2013 21:48:53 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/10/descobrindo-quais-tabelas-est%C3%A3o-em-quais-filegroups/</guid><description>&lt;p>Alguma vez você deve ter se perguntado: “Como eu sei em qual filegroup está essa tabela?”&lt;/p>
&lt;p>Existe uma ideia de que a hierarquia se dá da seguinte forma:&lt;/p>
&lt;blockquote>
&lt;p>Instância -&amp;gt; Database -&amp;gt; Filegroup -&amp;gt; Tabela -&amp;gt; Dados&lt;/p>&lt;/blockquote>
&lt;p>Porém está faltando um item aí que acaba passando despercebido muitas vezes… &lt;strong>Os índices!&lt;/strong> Ele é quem define onde os dados de uma tabela serão armazenados.&lt;/p>
&lt;p>O índice cluster é o responsável por organizar a tabela fisicamente. Seria conveniente dizer que ele “&lt;strong>&lt;em>É&lt;/em>&lt;/strong>” os dados da sua tabela (falar que os dados estão dentro do índice cluster me soa errado, então deixemos a frase estranha mesmo 🙂 ). Então, na prática, ao criar o seu índice cluster, você estará especificando o filegroup onde os dados serão armazenados.&lt;/p></description></item><item><title>Compatibility Views &amp; Catalog Views</title><link>https://blog.merazzi.com.br/posts/2013/07/compatibility-views-catalog-views/</link><pubDate>Thu, 18 Jul 2013 15:03:44 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/07/compatibility-views-catalog-views/</guid><description>&lt;p>Alguma vez você já parou para pensar em como as &lt;em style="line-height: 1.714285714; font-size: 1rem;">functions,&lt;/em> &lt;em style="line-height: 1.714285714; font-size: 1rem;">procedures, constraints, etc &lt;/em>ficam armazenadas no banco? Onde fica a definição dos objetos?&lt;/p>
&lt;p>No SQL Server 2000 existia uma tabela de sistema chamada &lt;em>syscomments.&lt;/em> Essa tabela retornava 1 linha a cada 4000 caracteres que tivesse a definição do objeto.&lt;/p></description></item><item><title>Função Escalar x Table Valued Function</title><link>https://blog.merazzi.com.br/posts/2013/07/fun%C3%A7%C3%A3o-escalar-x-table-valued-function/</link><pubDate>Mon, 01 Jul 2013 15:59:18 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/07/fun%C3%A7%C3%A3o-escalar-x-table-valued-function/</guid><description>&lt;p>Muito se fala na internet sobre como as funções escalares são terríveis e que devemos evitar o uso a todo o custo… Eu gostaria de mostrar o porquê:&lt;/p>
&lt;p>Vejam o seguinte script abaixo (um procedimento muito utilizado por aí: a utilização de uma função escalar que trata “N” casos e retorna o valor desejado). Primeiro, a criação da tabela e inserção dos dados:&lt;/p>
&lt;pre class="lang:tsql decode:true">CREATE TABLE NotaFiscal (Cod int identity primary key, Pessoa varchar(20), Valor decimal (15,2), Data date)
CREATE INDEX Ncl_NotaFiscal ON NotaFiscal (Data) INCLUDE (Pessoa, Valor)
GO
-- Inserindo 10 notas no período de 500 dias (5000 notas).
INSERT INTO NotaFiscal
SELECT 'Logan', 100, DATEADD(DD, Number, '2012-12-31')
from Numbers
WHERE Number &amp;lt; 500
GO 10
GO
CREATE FUNCTION CalculaTributos (@Codigo int, @Tipo char(1))
Returns decimal(15,2)
AS
BEGIN
DECLARE @valor decimal(15,2)
SELECT @Valor =
CASE @tipo
WHEN 'a' then valor * 0.1
WHEN 'b' then valor * 0.3
WHEN 'c' then valor * 0.5
END
FROM NotaFiscal
RETURN @valor
END;&lt;/pre>
&lt;p> &lt;/p></description></item><item><title>3º Encontro do grupo SQLServerRS de 2013 – Scripts</title><link>https://blog.merazzi.com.br/posts/2013/05/3%C2%BA-encontro-do-grupo-sqlserverrs-de-2013-scripts/</link><pubDate>Thu, 09 May 2013 16:39:01 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/05/3%C2%BA-encontro-do-grupo-sqlserverrs-de-2013-scripts/</guid><description>&lt;p>Pessoal,&lt;/p>
&lt;p>Antes de qualquer coisa, gostaria de agradecer ao grupo (pela enésima vez) a oportunidade de me permitir palestrar neste 3º encontro.&lt;/p>
&lt;p>O encontro na Ftec foi muito bom, primeiramente com o Marcus Vinícius falando sobre a comunidade SQL Server e o PASS. Após, eu assumi o projetor e falei sobre Snapshot no SQL Server.&lt;/p></description></item><item><title>3º Encontro de 2013 do Grupo SQL Server RS – Comigo!</title><link>https://blog.merazzi.com.br/posts/2013/04/3%C2%BA-encontro-de-2013-do-grupo-sql-server-rs-comigo/</link><pubDate>Mon, 29 Apr 2013 19:16:50 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/04/3%C2%BA-encontro-de-2013-do-grupo-sql-server-rs-comigo/</guid><description>&lt;p>Pessoal, com muita honra e orgulho foi convidado pelo Chapter Leader do grupo SQL Server RS, Marcus Vinícius Bittencourt para palestrar no próximo encontro do grupo.&lt;/p>
&lt;p>Pois bem, o encontro será realizado na &lt;a href="http://www.ftec.com.br" target="_blank" rel="noopener">FTEC&lt;/a> (Caxias do Sul – RS), no dia 04/05/2013 às 14 horas e o assunto será:&lt;/p>
&lt;p>&lt;strong>Snapshot Database: o que é, pra que serve e como usar&lt;/strong>.&lt;/p>
&lt;p>Fica aberto o convite à todos!&lt;/p>
&lt;p>Até!&lt;/p></description></item><item><title>SQL Server + Volume Shadow Copy = Sem backup diferencial.</title><link>https://blog.merazzi.com.br/posts/2013/04/sql-server--volume-shadow-copy-sem-backup-diferencial./</link><pubDate>Wed, 24 Apr 2013 19:27:46 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/04/sql-server--volume-shadow-copy-sem-backup-diferencial./</guid><description>&lt;p>Após implementar o recurso de envio de e-mails com os erros de backup do SQL Server, notei que o backup diferencial não estava sendo executado, apresentando o seguinte erro:&lt;/p>
&lt;blockquote>
&lt;p>Cannot perform a differential backup for database “MyDatabase”, because a current database backup does not exist. Perform a full database backup by reissuing BACKUP DATABASE, omitting the WITH DIFFERENTIAL option. [SQLSTATE 42000] (Error 3035)  BACKUP DATABASE is terminating abnormally. [SQLSTATE 42000] (Error 3013).  The step failed.&lt;/p>&lt;/blockquote></description></item><item><title>SQL Server Database Snapshot</title><link>https://blog.merazzi.com.br/posts/2013/04/sql-server-database-snapshot/</link><pubDate>Fri, 12 Apr 2013 19:45:29 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2013/04/sql-server-database-snapshot/</guid><description>&lt;p>O Database Snaphot (ou “instantâneo de Banco de Dados”, se você estiver no SQL Server em português – Que nome terrível, hehehe) é um banco de dados _&lt;strong>somente leitura,&lt;/strong> _onde o SQL Server guarda os dados originais de tudo o que está sendo alterado pelos usuários, para que seja possível realizar verificações (dentre outras coisas) de como estava o banco antes destas ocorrerem.&lt;/p>
&lt;p>Ao contrário do que muita gente pensa, as alterações ocorrem nas páginas de dados e não no objeto que está sofrendo alteração. O SQL Server utiliza um recurso chamado “Copy-on-write” onde, antes da página ser alterada, os dados originais são armazenados no snapshot.&lt;/p></description></item><item><title>SQL Server Internal Ops. Eu fui!</title><link>https://blog.merazzi.com.br/posts/2012/12/sql-server-internal-ops.-eu-fui/</link><pubDate>Sun, 09 Dec 2012 23:35:15 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2012/12/sql-server-internal-ops.-eu-fui/</guid><description>&lt;p>No dia 07/12, foi realizado na PUC o SQL Server Internal Ops, um evento idealizado pelas comunidades &lt;a href="http://www.sqlserverrs.com.br/" target="_blank" rel="noopener">SQL Server RS&lt;/a> e &lt;a href="http://mcitpsc.com.br" target="_blank" rel="noopener">MSITPSC&lt;/a>, com o apoio da Microsoft e da Dell.&lt;/p>
&lt;p>Há muito tempo que eu ansiava por um evento do gênero aqui em Porto Alegre, com foco 100% em SQL Server, uma vez que já houveram eventos semelhantes em São Paulo, Rio de Janeiro (Que eu felizmente consegui ir), Recife (com o SQL Saturday) enquanto nós, que moramos aqui no RS, não tínhamos nada.&lt;/p></description></item><item><title>“No such interface supported” ao criar / abrir um projeto no SSMS 2012</title><link>https://blog.merazzi.com.br/posts/2012/09/no-such-interface-supported-ao-criar-/-abrir-um-projeto-no-ssms-2012/</link><pubDate>Wed, 05 Sep 2012 12:46:05 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2012/09/no-such-interface-supported-ao-criar-/-abrir-um-projeto-no-ssms-2012/</guid><description>&lt;p>Onde trabalhamos, utilizamos o Source Safe para realizar o controle de alterações nas functions e procedures de Banco de Dados. Foi criado um projeto que contém os objetos e, dentro do SSMS, fazemos o checkout / checkin deles, já integrado com o Source Safe.&lt;/p>
&lt;p>Acontece que hoje, ao tentar migrar o projeto para abrirmos no SQL Server Management Studio 2012, apareceu o erro:&lt;/p>
&lt;blockquote>
&lt;p>Error: No such interface supported&lt;br>
File: vsee\internal\inc\vscomptr.inl&lt;br>
Line number: 259&lt;/p></description></item><item><title>Cuidados ao usar Exists</title><link>https://blog.merazzi.com.br/posts/2012/07/cuidados-ao-usar-exists/</link><pubDate>Tue, 03 Jul 2012 23:26:35 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2012/07/cuidados-ao-usar-exists/</guid><description>&lt;p>6 meses depois do último post (e com o planejamento de ano novo completamente furado – o de postar pelo menos 1 vez a cada 15 dias… 🙁 )…&lt;br>
Dica rápida para quem usar &lt;strong>&lt;em>EXISTS&lt;/em>&lt;/strong> :&lt;br>
Nunca utilize uma função de agregação quando utilizar o EXISTS. Por quê?&lt;br>
Segue um script rápido que insere alguns poucos registros em uma tabela para testarmos…&lt;/p>
&lt;pre lang="sql" class="">CREATE DATABASE TesteExists --Super original, não? :-)
GO
USE TesteExists
GO
CREATE TABLE Pessoa (Nome varchar(20), Nascimento datetime, Sexo char(1), CPF varchar(11), EstadoCivil char(1))
GO
INSERT INTO Pessoa Values ('Logan', '19810101', 'M', '11111111111','C')
INSERT INTO Pessoa Values ('Denise','19800101', 'F', '22222222222','C')
INSERT INTO Pessoa Values ('Sophia', '20120101', 'F', NULL,'S')
GO
IF EXISTS (SELECT MAX(Nascimento) FROM Pessoa WHERE nome = 'xxxxx')
SELECT 'OK'
ELSE SELECT 'NOK'&lt;/pre>
&lt;p>&lt;img loading="lazy" src="https://blog.merazzi.com.br/images/2012/07/Post_Exists1.png">&lt;/p></description></item><item><title>Colunas Default (e Como Mantê-las)</title><link>https://blog.merazzi.com.br/posts/2011/12/colunas-default-e-como-mant%C3%AA-las/</link><pubDate>Tue, 13 Dec 2011 21:43:55 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2011/12/colunas-default-e-como-mant%C3%AA-las/</guid><description>&lt;p>Muitas vezes precisamos que uma determinada coluna receba um valor padrão, por exemplo, uma tabela de pedidos que, ao inserir um registro novo, coloca por padrão a data atual no campo que referencia a data do pedido.&lt;/p>
&lt;blockquote>
&lt;p>Ok, mas como é que eu faço isso?&lt;/p>&lt;/blockquote>
&lt;p>Muito simples, pequeno gafanhoto, ao criar uma tabela:&lt;/p>
&lt;pre lang="sql" class="">CREATE TABLE MinhaTabela
(
Codigo int identity,
Nome varchar(100) NOT NULL,
Valor int NOT NULL,
Data datetime not null CONSTRAINT DF_MinhaTabela_Data default getdate()
)
&lt;/pre>
&lt;blockquote>
&lt;p>Putz! Mas o campo Valor também tinha que ter um valor Default… Será que eu consigo colocar sem ter que refazer a criação ou dropar a coluna?&lt;/p></description></item><item><title>Entendendo e usando CTE (Common Table Expression)</title><link>https://blog.merazzi.com.br/posts/2011/08/entendendo-e-usando-cte-common-table-expression/</link><pubDate>Wed, 10 Aug 2011 04:42:27 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2011/08/entendendo-e-usando-cte-common-table-expression/</guid><description>&lt;p>As CTE’s são muito semelhantes às tabelas derivadas, mas com uma boa vantagem…&lt;/p>
&lt;p>De acordo com o &lt;a href="http://msdn.microsoft.com/en-us/library/ms190766.aspx" target="_blank" rel="noopener">BOL&lt;/a> a estrutura para uma CTE é:&lt;/p>
&lt;pre lang="sql" class="">WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
SELECT
FROM expression_name;&lt;/pre>
&lt;p>Uma comparação de uso entre uma tabela derivada e uma CTE:&lt;/p>
&lt;p>&lt;strong>Tabela derivada:&lt;/strong>&lt;/p>
&lt;pre lang="sql">SELECT *
FROM
(SELECT Nome, Cidade
FROM CLIENTES
WHERE DataCadastro &amp;gt; '2011-01-01') AS CLI2011&lt;/pre>
&lt;p>&lt;strong>Usando CTE:&lt;/strong>&lt;/p>
&lt;pre lang="sql">;WITH CLI2011
AS
( SELECT Nome, Cidade
FROM CLIENTES
WHERE DataCadastro &amp;gt; '2011-01-01')
SELECT * FROM CLI2011;&lt;/pre>
&lt;p>Note o ‘;’ antes do WITH… Ele está lá por eu considerar uma boa prática, uma vez que sempre que você utilizar uma CTE, caso tenha alguma outra consulta antes, ela obrigatoriamente deve terminar com o ‘;’. Então, por via das dúvidas, sempre coloque ele antes do WITH, quando for usar uma CTE.&lt;/p></description></item><item><title>Como visualizar as descrições das colunas de uma tabela</title><link>https://blog.merazzi.com.br/posts/2011/07/como-visualizar-as-descri%C3%A7%C3%B5es-das-colunas-de-uma-tabela/</link><pubDate>Mon, 11 Jul 2011 18:46:28 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2011/07/como-visualizar-as-descri%C3%A7%C3%B5es-das-colunas-de-uma-tabela/</guid><description>&lt;p>Post rápido…&lt;/p>
&lt;p>Estava cansado e ir no design do SSMS pra ver a descrição de algumas colunas e resolvi pegar as tabelas relacionadas e montar um script que fizesse isso. Segue:&lt;/p>
&lt;blockquote>
&lt;pre class="lang:default decode:true">SELECT&lt;/blockquote>
&lt;p>  OBJECT_NAME(c.object_id) Tabela,
  c.name Coluna,
  ex.value Descricao
FROM 
  sys.columns c 
LEFT OUTER JOIN 
  sys.extended_properties ex 
ON 
  ex.major_id = c.object_id
  AND ex.minor_id = c.column_id 
WHERE 
  OBJECT_NAME(c.object_id) = &amp;lsquo;Sua_Tabela&amp;rsquo;
ORDER 
  BY OBJECT_NAME(c.object_id), c.column_id&lt;/pre>&lt;/p>
&lt;p>Espero que ajude… 🙂&lt;/p>
&lt;p>[]’s&lt;/p></description></item><item><title>Funções de Ranqueamento</title><link>https://blog.merazzi.com.br/posts/2011/02/fun%C3%A7%C3%B5es-de-ranqueamento/</link><pubDate>Wed, 23 Feb 2011 03:30:41 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2011/02/fun%C3%A7%C3%B5es-de-ranqueamento/</guid><description>&lt;p>Existem 4 funções de ranqueamento que podem ser utilizados com a cláusula OVER:&lt;/p>
&lt;ul>
&lt;li>ROW_NUMBER&lt;/li>
&lt;li>RANK&lt;/li>
&lt;li>DENSE_RANK&lt;/li>
&lt;li>NTILE&lt;/li>
&lt;/ul>
&lt;p>Um exemplo de uso:&lt;/p>
&lt;pre>SELECT orderid, custid, val,
  ROW_NUMBER() OVER(ORDER BY val) AS rownum,
  RANK()       OVER(ORDER BY val) AS rank,
  DENSE_RANK() OVER(ORDER BY val) AS dense_rank,
  NTILE(10)   OVER(ORDER BY val) AS ntile
FROM Sales.OrderValues
ORDER BY val;&lt;/pre>
&lt;p>O retorno é:&lt;/p>
&lt;pre>orderid     custid      val       rownum  rank    dense_rank ntile
----------- ----------- --------- ------- ------- ---------- -----
10782       12          12.50     1       1       1          1
10807       27          18.40     2       2       2          1
10586       66          23.80     3       3       3          1
10767       76          28.00     4       4       4          1
10898       54          30.00     5       5       5          1
10900       88          33.75     6       6       6          1
10883       48          36.00     7       7       7          1
11051       41          36.00     8       7       7          1
10815       71          40.00     9       9       8          1
10674       38          45.00     10      10      9          1
...
10691       63          10164.80  821     821     786        10
10540       63          10191.70  822     822     787        10
10479       65          10495.60  823     823     788        10
10897       37          10835.24  824     824     789        10
10817       39          10952.85  825     825     790        10
10417       73          11188.40  826     826     791        10
10889       65          11380.00  827     827     792        10
11030       71          12615.05  828     828     793        10
10981       34          15810.00  829     829     794        10
10865       63          16387.50  830     830     795        10&lt;/pre>
&lt;pre>(830 row(s) affected)&lt;/pre>
&lt;p>A função ROW_NUMBER() retorna uma ordenação sequencial para o resultado da consulta, baseado no que foi especificado no ORDER BY da cláusula OVER. Note que eu poderia retornar a ordenação pela coluna custid, modificando apenas a coluna rownum e mantendo a mesma ordem no retorno da consulta.&lt;/p></description></item><item><title>A cláusula OVER</title><link>https://blog.merazzi.com.br/posts/2011/02/a-cl%C3%A1usula-over/</link><pubDate>Tue, 22 Feb 2011 16:26:14 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2011/02/a-cl%C3%A1usula-over/</guid><description>&lt;p>Com a cláusula OVER você faz com que uma &lt;strong>janela de registros&lt;/strong> passe por alguns cálculos.&lt;/p>
&lt;p>Entenda por janela de registros como sendo uma quantidade de registros no qual o cálculo será realizado.&lt;/p>
&lt;p>Ao contrário do GROUP BY, onde o retorno é de apenas uma linha para cada agrupamento realizado, com a cláusula OVER você consegue trabalhar no contexto do SELECT, ou seja, para cada registro da sua lista. Desta forma, você não precisa trabalhar com o GROUP BY e ainda tem como retorno o cálculo desejado.&lt;/p></description></item></channel></rss>