<?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>SQL Server on Brain (Hugo + Obsidian)</title><link>https://blog.merazzi.com.br/tags/sql-server/</link><description>Recent content in SQL Server 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/tags/sql-server/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>Gap (pulo) no Identity, como evitar?</title><link>https://blog.merazzi.com.br/posts/2018/04/gap-pulo-no-identity-como-evitar/</link><pubDate>Fri, 27 Apr 2018 01:01:32 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2018/04/gap-pulo-no-identity-como-evitar/</guid><description>&lt;p>Desde o SQL Server 2012, o produto sofreu uma alteração no controle dos campos IDENTITY onde, logo na inicialização da instância, ele coloca em cache aproximadamente 1000 registros para agilizar o processo. Ao fazer isso, o identity é “pré-usado” internamente e o SQL se encarrega de entregar os próximos valores.&lt;/p>
&lt;p>O ‘problema’ é que, ao reinicializar a instância, o cache é perdido e ele cria um gap desses registros não utilizados.&lt;/p></description></item><item><title>Quebrando o seu backup em ‘n’ arquivos</title><link>https://blog.merazzi.com.br/posts/2018/01/quebrando-o-seu-backup-em-n-arquivos/</link><pubDate>Sat, 20 Jan 2018 23:46:11 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2018/01/quebrando-o-seu-backup-em-n-arquivos/</guid><description>&lt;p>Participar dos grupos do Whatsapp tem muita coisa ruim (haja treta, gifs, imagens, piadas e etc para suportar), mas tem várias coisas bem boas também. E uma delas diz respeito ao aprendizado diário que a comunidade te proporciona, se você estiver inserido no grupo certo.&lt;/p>
&lt;p>Em um dos grupos do WhatsApp que eu participo, surgiu a seguinte pergunta (há um bom tempo, mas só agora resolvi escrever a respeito):&lt;/p>
&lt;blockquote>
&lt;p>“Alguém poderia me ajudar com script para compactar o backup assim que concluir o bak, usando o 7zip, winrar ou zip?”&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>Evitando a execução de uma trigger sem precisar desabilitá-la</title><link>https://blog.merazzi.com.br/posts/2017/08/evitando-a-execu%C3%A7%C3%A3o-de-uma-trigger-sem-precisar-desabilit%C3%A1-la/</link><pubDate>Wed, 30 Aug 2017 19:38:56 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2017/08/evitando-a-execu%C3%A7%C3%A3o-de-uma-trigger-sem-precisar-desabilit%C3%A1-la/</guid><description>&lt;p>Olá pessoal!&lt;/p>
&lt;p>Gostaria hoje de dar uma dica para quem precisa executar aquele INSERT / UPDATE / DELETE sem disparar a trigger para a tabela… &lt;strong>E sem precisar desabilitá-la!&lt;/strong>&lt;/p>
&lt;p>Observação: Você vai precisar alterar a trigger para que funcione, disso você não ter como escapar.&lt;/p></description></item><item><title>Divisão de decimal com inteiro, como ficam as casas decimais?</title><link>https://blog.merazzi.com.br/posts/2017/08/divis%C3%A3o-de-decimal-com-inteiro-como-ficam-as-casas-decimais/</link><pubDate>Thu, 03 Aug 2017 20:12:40 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2017/08/divis%C3%A3o-de-decimal-com-inteiro-como-ficam-as-casas-decimais/</guid><description>&lt;p>Surgiu a seguinte dúvida no trabalho esse dias que foi mais ou menos assim:&lt;/p>
&lt;blockquote>
&lt;p>Tenho duas colunas e estou realizando uma divisão entre elas. Qual vai ser o tipo retornado? O SQL Server segue a ordem de precedência do tipo do dado?&lt;/p>&lt;/blockquote>
&lt;p>De bate pronto, a resposta é um “Sim, ele sempre vai seguir a ordem de precedência e vai retornar o tipo de dado que você está usando que possui maior precedência.”&lt;br>
Porém (sempre tem um porém), isso não é valido para os tipos decimais.&lt;/p></description></item><item><title>Trigger: Update() no campo com o mesmo valor, é validado?</title><link>https://blog.merazzi.com.br/posts/2017/05/trigger-update-no-campo-com-o-mesmo-valor-%C3%A9-validado/</link><pubDate>Tue, 23 May 2017 15:05:16 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2017/05/trigger-update-no-campo-com-o-mesmo-valor-%C3%A9-validado/</guid><description>&lt;p>Post rápido depois de meses de inércia e blog fora do ar, agora sob novo domínio!&lt;/p>
&lt;p>Surgiu uma dúvida onde eu trabalho e eu achei interessante postar aqui um caso de exemplo para futura referência.&lt;/p>
&lt;p>A questão: “Se eu fizer um update em uma coluna, mas usando o mesmo valor, o SQL executa a trigger, ok. Mas a função UPDATE(coluna) é validada? O SQL não é inteligente o suficiente para ignorar o update, uma vez que o campo é o mesmo?”&lt;/p>
&lt;p>Se quiser parar por aqui, a resposta é um singelo e simples: &lt;strong>Não&lt;/strong>.&lt;/p>
&lt;p>Agora, se quiser ver o caso funcionando… &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>Valide seus backups com a prRestore</title><link>https://blog.merazzi.com.br/posts/2016/07/valide-seus-backups-com-a-prrestore/</link><pubDate>Wed, 06 Jul 2016 18:52:51 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2016/07/valide-seus-backups-com-a-prrestore/</guid><description>&lt;p>EDIT&lt;/p>
&lt;p>O script foi atualizado! Versão 2.0 saindo do forno!!&lt;/p>
&lt;p>Agora é possível usar o script para restaurar o último diferencial criado também… E os logs, obviamente, respeitarão a opção. &lt;a href="https://github.com/LoganMerazzi/SQLServerScripts/blob/master/prRestore_2_0.sql" target="_blank" rel="noopener">Baixe aqui&lt;/a>!&lt;/p>
&lt;p>FIM DO EDIT&lt;/p>
&lt;p>Se você perguntar para “N” profissionais qual o principal bem das empresas, a resposta será praticamente a mesma: Os dados que ela possui (e se você achava que era o próprio funcionário, sinto te desiludir).&lt;br>
E para garantir que os seus dados estejam sempre prontos para serem recuperados em caso de desastre, basta você fazer o backup dela periodicamente, seguindo uma politica que te permita recuperá-la em um ponto no tempo (eu recomendo ler sobre a &lt;a href="https://edvaldocastro.com/free-script-sp_backup-gerencie-suas-rotinas-de-modo-facil-e-objetivo/" target="_blank" rel="noopener">procedure criada pelo Edvaldo Cast&lt;/a>ro sobre o assunto), correto??&lt;/p></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>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><item><title>Em busca de mais uma certificação…</title><link>https://blog.merazzi.com.br/posts/2011/02/em-busca-de-mais-uma-certifica%C3%A7%C3%A3o/</link><pubDate>Tue, 22 Feb 2011 16:20:17 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2011/02/em-busca-de-mais-uma-certifica%C3%A7%C3%A3o/</guid><description>&lt;p>Estou estudando para mais uma certificação (70-433 – TS: Microsoft SQL Server 2008, Database Development) e, com o intuito de fixar o conteúdo, vou colocar aqui uma série de posts que eu acho interessante divulgar.&lt;/p>
&lt;p>Para a prova, estou me baseando nos seguintes livros:&lt;/p>
&lt;ul type="circle">
&lt;li>
Microsoft® SQL Server® 2008 T-SQL Fundamentals
&lt;/li>
&lt;li>
Inside Microsoft SQL Server 2008: T-SQL Querying
&lt;/li>
&lt;li>
Inside Microsoft SQL Server 2008: T-SQL Programming (Pro-Developer)
&lt;/li>
&lt;li>
MCTS Self-Paced Training Kit (Exam 70-433): Microsoft® SQL Server® 2008 &amp;#8211; Database Development
&lt;/li>
&lt;/ul>
&lt;p>A minha idéia é conseguir fazer a prova em abril e então, no meio do ano, fazer a 70-451 (PRO: Designing Database Solutions and Data Access Using Microsoft SQL Server 2008), concluindo a trilha de Desenvolvedor. Depois é partir pra parte de BI.&lt;/p></description></item><item><title>Questão sobre SQL Server…</title><link>https://blog.merazzi.com.br/posts/2009/05/quest%C3%A3o-sobre-sql-server/</link><pubDate>Tue, 12 May 2009 11:33:15 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2009/05/quest%C3%A3o-sobre-sql-server/</guid><description>&lt;p>Ontem me deparei com uma questão um tanto quanto interessante…&lt;br>
Qual o resultado das queries abaixo? Elas são equivalentes???&lt;/p>
&lt;p>Query 1:&lt;/p>
&lt;div id="highlighter_545266" class="syntaxhighlighter">
&lt;div class="lines">
&lt;div class="line alt1">
&lt;pre class="lang:default decode:true ">SELECT *
FROM (
  SELECT 1 col1 UNION
  SELECT 2 UNION
  SELECT 3
) T1
LEFT JOIN (
  SELECT 1 col1 UNION
  SELECT 3
) T2
 ON t1.col1 = t2.col1
WHERE t2.col1 IS NULL&lt;/pre>
&lt;p>Query 2:&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="line alt1">
&lt;pre class="lang:default decode:true ">SELECT *
FROM (
  SELECT 1 col1 UNION
  SELECT 2 UNION
  SELECT 3
) T1
LEFT JOIN (
  SELECT 1 col1 UNION
  SELECT 3
) T2
 ON t1.col1 = t2.col1
  AND t2.col1 IS NULL&lt;/pre>
&lt;p>Passando o olho rapidamente, parece ser a mesma coisa, mas reparem na última linha, a única diferença entre elas é o uso do where e o outro existe somente o join.&lt;/p></description></item><item><title>MCTS SQL Server 2005!!! :-D</title><link>https://blog.merazzi.com.br/posts/2009/03/mcts-sql-server-2005-d/</link><pubDate>Tue, 17 Mar 2009 16:41:39 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2009/03/mcts-sql-server-2005-d/</guid><description>&lt;div align="center">
![](/images/2009/03/mcts.gif)
&lt;/div>
&lt;p>Só pra dizer que acabei de passar na prova 70-431 da Microsoft: &lt;strong>“SQL Server 2005 – Implementing and Maintenance”&lt;/strong>&lt;br>
Que baita alívio, estava achando que não passaria nessa prova mas para a minha surpresa, passei com 880 no simulado e 947 na teórica (valendo 1000).&lt;br>
Essa é a segunda prova da MS que eu faço (e passo). Há 9 anos atrás eu fiz a de &lt;em>Windows NT Server 4.0.&lt;/em>&lt;br>
Agora é manter o ritmo, focar no TCC da faculdade e fazer as provas 70-441 e 70-442 (Database Developer), 70-443 e 70-444 (Database Administrator)!!&lt;br>
O negócio é não deixar a peteca cair!!! 😀&lt;/p></description></item><item><title>Certificações Microsoft para SQL Server 2005</title><link>https://blog.merazzi.com.br/posts/2009/02/certifica%C3%A7%C3%B5es-microsoft-para-sql-server-2005/</link><pubDate>Wed, 04 Feb 2009 10:27:06 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2009/02/certifica%C3%A7%C3%B5es-microsoft-para-sql-server-2005/</guid><description>&lt;p>Para conhecimento de todos, estou estudando (nem tanto quanto eu gostaria/deveria, mas enfim) para as provas de certificação da Microsoft em SQL Server 2005.&lt;/p>
&lt;p>Como existem muitas dúvidas a respeito, vou colocar aqui as provas que você deve fazer para atingir a titulação desejada.&lt;/p>
&lt;p>&lt;strong>MCTS – MICROSOFT CERTIFIED TECHNOLOGY SPECIALIST&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>exame obrigatório&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="http://www.microsoft.com/learning/exams/70-431.asp" target="_blank" rel="noopener">70-431&lt;/a> – Microsoft SQL Server 2005 – Implementation and Maintenance&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>MCITP: DATABASE DEVELOPER – MICROSOFT CERTIFIED IT PROFESSIONAL – DATABASE DEVELOPER&lt;/strong>&lt;/p></description></item><item><title>MSDN Experience: SQL Server</title><link>https://blog.merazzi.com.br/posts/2008/11/msdn-experience-sql-server/</link><pubDate>Mon, 10 Nov 2008 15:19:06 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2008/11/msdn-experience-sql-server/</guid><description>&lt;p>Pra quem não conhece, o MSDN Brasil oferece um programa de treinamento completo sobre o SQL Server e outras tecnologias, chamado MSDN Experience (&lt;a href="http://www.microsoft.com/brasil/msdn/experience/default.mspx" target="_blank" rel="noopener">http://www.microsoft.com/brasil/msdn/experience/default.mspx&lt;/a>).&lt;br>
Como estou trabalhando direamente com SQL Server, entrei para dar uma olhada nos vídeos que tem lá e reparei que já estão disponíveis os testes do primeiro e do segundo módulo.&lt;br>
Para quem quer se aprofundar sobre o assunto e ver o seu nível de conhecimento, recomendo entrar e dar uma olhada.&lt;br>
Se você ainda não conhece o programa e quer aprender sobre o SQL Server, acesse: &lt;a href="http://www.msdnbrasil.com.br/experience/sqlserver/Home.aspx" target="_blank" rel="noopener">http://www.msdnbrasil.com.br/experience/sqlserver/Home.aspx&lt;/a>.&lt;/p></description></item></channel></rss>