<?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>T-SQL on Brain (Hugo + Obsidian)</title><link>https://blog.merazzi.com.br/categories/t-sql/</link><description>Recent content in T-SQL 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/t-sql/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>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>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>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>Gerando scripts DDL no Visual Studio 2013</title><link>https://blog.merazzi.com.br/posts/2015/04/gerando-scripts-ddl-no-visual-studio-2013/</link><pubDate>Wed, 15 Apr 2015 13:14:05 +0000</pubDate><guid>https://blog.merazzi.com.br/posts/2015/04/gerando-scripts-ddl-no-visual-studio-2013/</guid><description>&lt;p>_Eu ainda sou adepto da criação dos scripts pelo editor, principalmente pelo fato que “de vez em quando” o SSMS resolve dropar toda a tabela e criar uma nova estrutura, só porque você resolveu mudar uma coluna que é not null para null (por exemplo). _&lt;/p>
&lt;p>Mas segue uma dica para quem curte usar o modo design no SSMS e, por algum motivo qualquer, precisou usar o Visual Studio para realizar alguma manutenção no banco e não achou como gerar os scripts de forma fácil…&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>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>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></channel></rss>