<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diário de um DBA &#187; script</title>
	<atom:link href="http://silasmendes.com/dba/tag/script/feed" rel="self" type="application/rss+xml" />
	<link>http://silasmendes.com/dba</link>
	<description>Tecnologia &#38; Banco de Dados</description>
	<lastBuildDate>Tue, 27 Dec 2011 12:53:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Backup compactado</title>
		<link>http://silasmendes.com/dba/backup-compactado</link>
		<comments>http://silasmendes.com/dba/backup-compactado#comments</comments>
		<pubDate>Tue, 14 Sep 2010 14:47:42 +0000</pubDate>
		<dc:creator>Silas Mendes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Vida Real]]></category>
		<category><![CDATA[adventureWorks]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[compactar]]></category>
		<category><![CDATA[comprimir]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sp_configure]]></category>
		<category><![CDATA[sql backup]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>

		<guid isPermaLink="false">http://silasmendes.com/dba/?p=677</guid>
		<description><![CDATA[A compressão de backups sempre foi um dilema para quem lida com grandes bases de dados no SQL Server. Muitos DBAs criaram rotinas para compactar arquivos de backup utilizando o bom e velho RAR, outros utilizavam soluções mais interessantes como o SQL Backup da RedGate. Finalmente na versão 2008 a Microsoft adicionou uma solução nativa [...]]]></description>
			<content:encoded><![CDATA[<p>A compressão de backups sempre foi um dilema para quem lida com grandes bases de dados no SQL Server. Muitos DBAs criaram rotinas para compactar arquivos de backup utilizando o bom e velho RAR, outros utilizavam soluções mais interessantes como o <a href="http://www.red-gate.com/products/SQL_Backup/" target="_blank">SQL Backup</a> da RedGate.</p>
<p>Finalmente na versão 2008 a Microsoft adicionou uma solução nativa para compactação de backups, no entanto esta opção só estava disponível na edição Enterprise.</p>
<p>Com a chegada do 2008 R2 a Microsoft estendeu a funcionalidade para a edição Standard; ou seja, a coisa tá ficando mais acessível.</p>
<p><strong>“Mão na massa”</strong></p>
<p>Para compactar o backup o processo é bem simples, basicamente precisamos adicionar a opção <strong>WITH COMPRESSION</strong> no comando de backup:</p>
<pre class="brush: sql; title: ; notranslate">
BACKUP DATABASE AdventureWorks
TO DISK = 'C:\AdventureWorks_compactado.BAK'
WITH COMPRESSION;
</pre>
<p>Agora o mais interessante: comparando backups da base AdventureWorks, um compactado e outro sem compactação, temos os seguintes números:</p>
<p><img class="aligncenter size-full wp-image-679" title="compactaBKP" src="http://silasmendes.com/dba/wp-content/uploads/2010/09/compactaBKP1.png" alt="" width="442" height="36" /></p>
<p>Vemos que o arquivo compactado tem cerca de 25% do tamanho do arquivo sem compactação. Bem bacana, não é?</p>
<p>Se você deseja que a compactação de backup seja <em>Default</em> na sua instância, altere a configuração <strong>backup compression default</strong> para 1:</p>
<pre class="brush: sql; title: ; notranslate">
EXEC sp_configure 'backup compression default', '1';
RECONFIGURE;
</pre>
<p class="MsoNormal">Assim, quando você realizar um backup, mesmo que não utilize explicitamente a opção <strong>WITH COMPRESSION</strong> (ou esqueça de utilizá-la) seus backups serão compactados.</p>
<p><span style="font-size: 12.0pt; font-family: &amp;amp;amp; mso-fareast-font-family: &amp;amp;amp; mso-ansi-language: PT-BR; mso-fareast-language: PT-BR; mso-bidi-language: AR-SA;">Bom trabalho!</span></p>
]]></content:encoded>
			<wfw:commentRss>http://silasmendes.com/dba/backup-compactado/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Automatizando tarefas via script</title>
		<link>http://silasmendes.com/dba/adicionando-job-via-script</link>
		<comments>http://silasmendes.com/dba/adicionando-job-via-script#comments</comments>
		<pubDate>Tue, 02 Mar 2010 21:27:58 +0000</pubDate>
		<dc:creator>Silas Mendes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL SERVER 2000]]></category>
		<category><![CDATA[SQL SERVER 2005]]></category>
		<category><![CDATA[SQL SERVER 2008]]></category>
		<category><![CDATA[SQL SERVER 2008 R2]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[MSDE]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[SQL Agent]]></category>
		<category><![CDATA[sysjobs]]></category>

		<guid isPermaLink="false">http://silasmendes.com/dba/?p=515</guid>
		<description><![CDATA[Na época em que o MSDE estava em alta, muitos amigos vinham pedir dicas de como criar uma rotina automática de backups e etc, o maior impasse era sempre a falta de uma interface gráfica. Ao contrário das novas versões do SQL Server Express, o MSDE possuía o serviço SQL Agent que permite agendar rotinas, [...]]]></description>
			<content:encoded><![CDATA[<p><strong><br />
</strong></p>
<p>Na época em que o MSDE estava em alta, muitos amigos vinham pedir dicas de como criar uma rotina automática de backups e etc, o maior impasse era sempre a falta de uma interface gráfica.</p>
<p>Ao contrário das novas versões do SQL Server Express, o MSDE possuía o serviço SQL Agent que permite agendar rotinas, backups, etc, e isso era ótimo, mas a barreira era saber como utilizar essa funcionalidade sem uma ferramenta.</p>
<p>Mas enfim, o foco desse texto não é o MSDE, até porque, com o tempo foram disponibilizadas algumas ferramentas para suprir algumas necessidades. A idéia principal é verificarmos como criar uma nova tarefa (job) e automatiza-la utilizando scripts no SQL Server.</p>
<p>Analisando um pouco veremos que precisamos apenas de 4 procedures para criação de um job: <strong>sp_add_job</strong>, <strong>sp_add_jobstep</strong>, <strong>sp_add_jobserver</strong> e <strong>sp_add_jobschedule</strong>. No nosso texto vamos utilizar como exemplo um cenário onde precisamos automatizar o backup da base de dados <em>Master</em>. Vamos analisar agora cada uma das procedures:</p>
<ul>
<li><strong>sp_add_job</strong></li>
</ul>
<p>Esta procedure adiciona um novo registro à tabela <strong>sysjobs</strong>, em linhas gerais, este registro é o nosso job, porém um job sem qualquer funcionalidade e sem agendamento. Inicialmente um job nessas condições não tem qualquer utilidade. Abaixo podemos verificar a criação de um job vazio com o título Backup MASTER:</p>
<pre class="brush: sql; title: ; notranslate">
execute sp_add_job @job_name = 'Backup MASTER'
</pre>
<ul>
<li><strong>sp_add_jobstep</strong></li>
</ul>
<p>Para darmos “vida” ao job criado anteriormente, precisamos adicionar funcionalidades a ele, por exemplo: um passo onde será executado o script de backup.  Para adicionar funcionalidades ao job <strong>Backup MASTER</strong> precisamos conhecer seu código gravado na <em>sysjobs</em>, para isso podemos executar o seguinte comando:</p>
<pre class="brush: sql; title: ; notranslate">
select  job_id
from  sysjobs
where name = 'Backup MASTER'
</pre>
<p>O resultado será um big código! Isso porque o código gerado é do tipo UNIQUEIDENTIFIER, popularmente conhecido como <em>Identificador Universal</em>.  O resultado da minha consulta é: <strong>7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31 </strong>(é mais prático trabalhar com conteúdos deste tipo armazenando-o numa variável, porém, neste texto iremos aborda-lo explicitamente em cada passo dos exemplos).</p>
<p>Ok. Agora vamos utilizar este big-código junto com a <strong>sp_add_jobstep</strong> para adicionarmos funcionalidade ao nosso JOB:</p>
<pre class="brush: sql; title: ; notranslate">
-- Adiciona função ao Job
execute sp_add_jobstep @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @step_name = 'Script Backup Master',
     @command = 'backup master to disk = ''c:\master.bak'''
</pre>
<p>Observe que utilizamos três parâmetros junto à <strong>sp_add_jobstep</strong>: o código do job (@job_id), o nome da funcionalidade (@step_name) e finalmente o script de backup no parâmetro @command.</p>
<p>É interessante esclarecer que um job pode ter inúmeros passos/tarefas, logo você poderá utilizar esta procedure quantas vezes forem necessárias para adicionar novos passos a um mesmo job.</p>
<ul>
<li><strong>sp_add_jobserver</strong></li>
</ul>
<p>Agora vem o passo mais “abstrato” desse processo. Após criarmos o job e definir suas funções precisamos definir em qual servidor ele irá operar. Pressupõe-se que se o job foi criado no servidor &lt;strong&gt;X&lt;/strong&gt; que ele deverá ser executado no contexto deste servidor, porém, aqui nós temos que explicitar isto, logo, precisaremos executar a procedure <strong>sp_add_jobserver </strong>e configurar o job para rodar no contexto do servidor local:</p>
<pre class="brush: sql; title: ; notranslate">
execute sp_add_jobserver
     @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @server_name = N'(local)'
</pre>
<p>Pronto!</p>
<p>Neste momento nosso job já tem uma forma e já pode ser executado.</p>
<p>Se quisermos testar a execução manualmente, podemos executar o seguinte comando:</p>
<pre class="brush: sql; title: ; notranslate"> sp_start_job 'Backup MASTER'</pre>
<p>Resultado:</p>
<p><strong>Job &#8216;Backup MASTER&#8217; started successfully.</strong></p>
<p>Vejam que nosso job foi executado com sucesso e que o arquivo foi criado:</p>
<p style="text-align: center;"><a href="http://silasmendes.com/dba/wp-content/uploads/2010/03/jobExecutado.png"><img class="size-medium wp-image-516 aligncenter" title="jobExecutado" src="http://silasmendes.com/dba/wp-content/uploads/2010/03/jobExecutado-300x35.png" alt="" width="300" height="35" /></a></p>
<ul>
<li><strong>sp_add_jobschedule</strong></li>
</ul>
<p>Considerando que a principal funcionalidade do SQL Server Agent e seus jobs é <strong>automatizar tarefas</strong>, não há muito sentindo em executar jobs manualmente, logo, precisamos criar um agendamento para nosso job e assim partimos para a última etapa deste processo onde recorremos à procedure <strong>sp_add_jobschedule</strong>:</p>
<pre class="brush: sql; title: ; notranslate">
execute sp_add_jobschedule
     @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @name = N'Agenda Backup',
     @freq_type = 4,
     @active_start_time = 120000,
     @freq_interval = 1
</pre>
<p>O comando pode parecer complexo, mas analisando com calma veremos que é bem tranquilo. Vamos analisar cada um dos parâmetros separadamente:</p>
<p>No <strong>@job_id</strong> definimos para qual job estamos criando o agendamento utilizando o &#8220;big-código&#8221;.</p>
<p>Em <strong>@name</strong> atribuímos um nome para o nosso agendamento.</p>
<p>Em<strong> @freq_type</strong> temos as seguintes possibilidades:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="288" valign="top"><strong>@freq_type</strong></td>
<td width="288" valign="top"><strong>Frequência de Execução</strong></td>
</tr>
<tr>
<td width="288" valign="top">1</td>
<td width="288" valign="top">somente uma vez</td>
</tr>
<tr>
<td width="288" valign="top">4</td>
<td width="288" valign="top">Diariamente</td>
</tr>
<tr>
<td width="288" valign="top">8</td>
<td width="288" valign="top">Semanalmente</td>
</tr>
<tr>
<td width="288" valign="top">16</td>
<td width="288" valign="top">Mensalmente</td>
</tr>
</tbody>
</table>
<p>No nosso script <strong>@freq_type </strong>= 4, logo, o comando indica que o job será executado diariamente.</p>
<p>Em <strong>@active_start_time</strong> definimos o horário da execução, no nosso exemplo 12:00:00, sem os sinais de separação entre horas, minutos e segundos. Se o conteúdo desse parâmetro fosse 215600, o job seria executado às 09:56 da noite.</p>
<p>Por fim temos o parâmetro <strong>@freq_interval</strong> que está diretamente atrelado ao parâmetro <strong>@freq_type</strong> e foi definido como <strong>1</strong> porque nosso backup será executado todos os dias.</p>
<p>(Pode ser complexo definir valor para o parâmetro <em>@freq_interval</em>, mas não iremos nos aprofundar nele neste momento. Para entender sua composição consulte: <a href="http://msdn.microsoft.com/pt-br/library/ms366342.aspx">http://msdn.microsoft.com/pt-br/library/ms366342.aspx</a>)</p>
<p>Para verificar todos os parâmetros das procedures listadas acima, digite por exemplo:</p>
<pre class="brush: sql; title: ; notranslate"> sp_help sp_add_jobschedule </pre>
<ul>
<li><strong>CONCLUSÃO</strong></li>
</ul>
<p>Neste texto podemos notar que automatizar tarefas via script não é uma tarefa tão árdua, mas sem dúvidas, na maioria<br />
dos cenários, a utilização de uma ferramenta gráfica proporcionará maior produtividade; porém se um dia você se deparar com um MSDE ou situação semelhante, irá lembrar que com basicamente 4 passos é possível automatizar suas rotinas.</p>
]]></content:encoded>
			<wfw:commentRss>http://silasmendes.com/dba/adicionando-job-via-script/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Restaurar Backup via Script</title>
		<link>http://silasmendes.com/dba/restaurar-backup-no-sql-server-via-script</link>
		<comments>http://silasmendes.com/dba/restaurar-backup-no-sql-server-via-script#comments</comments>
		<pubDate>Thu, 11 Feb 2010 12:59:07 +0000</pubDate>
		<dc:creator>Silas Mendes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SQL SERVER 2000]]></category>
		<category><![CDATA[SQL SERVER 2005]]></category>
		<category><![CDATA[SQL SERVER 2008]]></category>
		<category><![CDATA[SQL SERVER 2008 R2]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[restaurar backup]]></category>
		<category><![CDATA[Restore]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Sql Server]]></category>

		<guid isPermaLink="false">http://silasmendes.com/dba/?p=503</guid>
		<description><![CDATA[Existem três tipos básicos de backups no SQL Server: o backup completo, o backup diferencial e o backup incremental. O dois últimos sempre trabalham em conjunto com o backup completo. Uma estratégia de backup é algo muito particular de cada negócio; em alguns ambientes críticos é inadimissível a perda de um minuto de informação, já em outros [...]]]></description>
			<content:encoded><![CDATA[<p>Existem três tipos básicos de backups no SQL Server: o backup <strong>completo</strong>, o backup <strong>diferencial </strong>e o backup <strong>incremental</strong>. O dois últimos sempre trabalham em conjunto com o backup completo.</p>
<p>Uma estratégia de backup é algo muito particular de cada negócio; em alguns ambientes críticos é inadimissível a perda de um minuto de informação, já em outros lugares, na ocasião de uma falha, um backup do dia anterior é a solução ideal; logo, a forma como mesclar os diferentes tipos de backups é uma questão a ser analisada (e testada!) com muito critério.</p>
<p>No entanto de uma coisa temos certeza: toda estratégia de backup incluirá um backup completo (comumente chamado de backup FULL) e neste texto iremos focar na recuperação (via script) de um backup completo no SQL Server; para isso utilizaremos como base dois cenários:</p>
<ul>
<li>O primeiro cenário abordará o restore de um backup FULL sobre a base original (do backup), por exemplo, sua base de dados atual sofreu alterações inadequadas e agora precisa da restauração do último backup para reaver os dados anteriores.</li>
<li>No segundo cenário iremos visualizar um DBA que recebe um backup completo de um cliente e precisa restaurá-lo em outro ambiente, por exemplo, para sua equipe de desenvolvimento.</li>
</ul>
<p><strong>CENÁRIO 1</strong></p>
<p>Temos aqui um arquivo de backup chamado AdventuresWorks_FULL.bak. Antes de restaurá-lo precisamos verificar qual o conteúdo desse arquivo físico e se o backup existente irá atender a necessidade do <em>restore</em>; para isso utilizaremos o seguinte comando:</p>
<pre class="brush: sql; title: ; notranslate">restore headeronly from disk ='C:\LabRestore\AdventuresWorks_FULL.bak'</pre>
<p>Veja o resultado:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-504" title="01fig" src="http://silasmendes.com/dba/wp-content/uploads/2010/02/01fig.JPG" alt="01fig" width="565" height="86" /></p>
<p>No resultado da execução do comando RESTORE HEADERONLY podemos identificar que o arquivo em questão contém três backups (sim! um arquivo físico pode conter inúmeros backups de uma mesma base). Observe a posição de cada backup dentro do arquivo (campo Position), o tamanho de cada um (BackupSize)  e suas respectivas datas (BackupStartDate).</p>
<p>No nosso exemplo vamos restaurar o backup do dia <span style="text-decoration: underline;">03 de Fevereiro</span>, logo, o backup a ser restaurado será o da posição 2 (dois). Vamos ao script:</p>
<pre class="brush: sql; title: ; notranslate">
USE MASTER

GO

RESTORE DATABASE AdventureWorks

FROM DISK = 'C:\LabRestore\AdventuresWorks_FULL.bak'

WITH FILE = 2, REPLACE, STATS = 10
</pre>
<p>A base de dados a ser restaurada é a <strong>AdventureWorks</strong>, o arquivo de backup está localizado no endereço: C:\LabRestore\AdventuresWorks_FULL.bak. O backup que será restaurado está na posição 2 deste arquivo (FILE = 2). Como a base já existe é necessário sobrescrevê-la, para isto utilizamos a opção <strong>REPLACE.</strong> O <strong>STATS</strong> mostrará o progresso da restauração em intervalos de 10 em 10%.</p>
<p>Importante: Numa operação de <em>restore</em> a base não deve estar em uso por nenhum usuário (inclusive você), por isso antes de iniciar o script direcionamos a sessão para o database <strong>Master</strong>. Se a base estiver em uso, a seguinte mensagem de erro será exibida:</p>
<p><span style="color: #ff0000;">Msg 3101, Level 16, State 1, Line 1</span></p>
<p><span style="color: #ff0000;">Exclusive access could not be obtained because the database is in use.</span></p>
<p>Se tudo estiver ok, ao final da execução do script você verá uma mensagem similar a esta:</p>
<p><span style="color: #008000;">RESTORE DATABASE successfully processed 22514 pages in 10.209 seconds (18.065 MB/sec).</span></p>
<p><strong>CENÁRIO 2</strong></p>
<p>Neste cenário o DBA deverá restaurar um backup completo recebido de um cliente externo. O arquivo de backup está identificado como <strong>SistemaX_FULL.bak</strong> e será restaurado no ambiente de desenvolvimento que é composto por um servidor com um único disco (C:\).</p>
<p>Vamos analisar o conteúdo do arquivo com o RESTORE HEADERONLY:</p>
<pre class="brush: sql; title: ; notranslate">restore headeronly from disk = 'C:\LabRestore\SistemaX_FULL.bak'</pre>
<p>Veja o resultado:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-505" title="02fig" src="http://silasmendes.com/dba/wp-content/uploads/2010/02/02fig.JPG" alt="02fig" width="525" height="57" /></p>
<p>No resultado acima verificamos que existe um único backup neste arquivo. A base do cliente (campo DatabaseName) está identificada por <strong>SistemaX</strong> e podemos verificar também outros dados como o tamanho do backup e data.</p>
<p>Até aqui tudo bem, mas neste cenário precisamos analisar novos elementos, isso porque a base em questão ainda não existe e ao efetuar a restauração o SQL Server irá trazer além dos objetos deste banco (tabelas, procedures, triggers) suas configurações originais como: endereço dos arquivos físico de dados e log, modo de recovery, etc. Para verificar o estado de algumas destas propriedades podemos utilizar o comando RESTORE FILELISTONLY:</p>
<pre class="brush: sql; title: ; notranslate">restore filelistonly from disk = 'C:\LabRestore\SistemaX_FULL.bak'</pre>
<p>Veja o resultado:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-506" title="03fig" src="http://silasmendes.com/dba/wp-content/uploads/2010/02/03fig.JPG" alt="03fig" width="562" height="69" /></p>
<p>Observe que a base do cliente e seus respectivos arquivos de dados e log estão localizados em discos diferentes. Neste caso, se o DBA realizar um restore comum (como o script utilizado no exemplo anterior) o SQL Server tentará alocar estes arquivos em seus caminhos de origem, logo precisamos alterar este comportamento, já que neste cenário o servidor onde será realizado o restore só possui <strong>um disco</strong>. Veja o comando:</p>
<pre class="brush: sql; title: ; notranslate">
USE MASTER

GO

RESTORE DATABASE SistemaX
FROM DISK = 'C:\LabRestore\SistemaX_FULL.bak'
WITH
MOVE 'SistemaX' TO 'C:\LabRestore\SistemaX.mdf',
MOVE 'SistemaX_log' TO 'C:\LabRestore\SistemaX_log.ldf',
STATS = 10
</pre>
<p>A base de dados a ser restaurada é a <strong>SistemaX</strong> e o arquivo de backup está em: C:\LabRestore\SistemaX_FULL.bak. Observe que adicionamos a opção <strong>MOVE</strong>; esta opção direciona os arquivos de dados e log para um novo caminho. O restante não muda; continuo utilizando o STATS e desta vez não precisamos do REPLACE já que a base não existia.</p>
<p>É importante destacar que os comandos RESTORE FILELISTONLY e RESTORE HEADERONLY não são obrigatórios num processo de restauração de banco; eles são comandos que recuperam informações sobre os arquivos de backup e estas informações podem auxiliar o DBA no processo de restauração.</p>
<p>Existem outros comandos similares, como o RESTORE VERIFYONLY que verifica se o arquivo de backup está legível.</p>
<p><strong>CONCLUSÃO</strong></p>
<p>Como podemos verificar, o restore de um backup <em>full</em>, via script não é difícil, basta conhecer os comandos certos para recuperar informações sobre o conteúdo do arquivo de backup; estas informações  irão auxiliar o usuário na construção do comando de <em>restore</em>.</p>
<p>Nos próximos posts iremos abordar o restore de backups diferenciais e log. Até +</p>
<p>Bom trabalho!</p>
]]></content:encoded>
			<wfw:commentRss>http://silasmendes.com/dba/restaurar-backup-no-sql-server-via-script/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SQL Server via prompt de comando?</title>
		<link>http://silasmendes.com/dba/sql-server-via-prompt</link>
		<comments>http://silasmendes.com/dba/sql-server-via-prompt#comments</comments>
		<pubDate>Tue, 20 Oct 2009 20:30:02 +0000</pubDate>
		<dc:creator>Silas Mendes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SQL SERVER 2005]]></category>
		<category><![CDATA[SQL SERVER 2008]]></category>
		<category><![CDATA[SQL SERVER 2008 R2]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[consulta metadados]]></category>
		<category><![CDATA[DOS]]></category>
		<category><![CDATA[information_schema]]></category>
		<category><![CDATA[isql]]></category>
		<category><![CDATA[localhost]]></category>
		<category><![CDATA[Management Studio]]></category>
		<category><![CDATA[osql]]></category>
		<category><![CDATA[prompt DOS]]></category>
		<category><![CDATA[Query Analyser]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sp_readerrorlog]]></category>
		<category><![CDATA[sp_who]]></category>
		<category><![CDATA[sql server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[sqlcmd]]></category>

		<guid isPermaLink="false">http://silasmendes.com/dba/?p=404</guid>
		<description><![CDATA[Em minha experiência pessoal já vivi uma situação onde durante a atualização do principal sistema da empresa, nosso contato no datacenter reclamou dizendo que não conseguia abrir o Management Studio para executar nossos scripts. A solução mais rápida? Enviei para o datacenter o procedimento de execução dos scripts via SQLCMD. Mas o que é isso? [...]]]></description>
			<content:encoded><![CDATA[<p>Em minha experiência pessoal já vivi uma situação onde durante a atualização do principal sistema da empresa, nosso contato no datacenter reclamou dizendo que não conseguia abrir o <strong>Management Studio</strong> para executar nossos scripts.</p>
<p>A solução mais rápida? Enviei para o datacenter o procedimento de execução dos scripts via <strong>SQLCMD</strong>.</p>
<p>Mas o que é isso?</p>
<p>O SQLCMD é uma ferramenta que você utiliza para acessar instâncias SQL Server via prompt de comando (vulgo DOS). Não existem segredos, uma vez conectado, através de scripts você pode fazer tudo o que faria utilizando o <em>Query Analyser</em> ou o <em>Management Studio</em>. Apesar de ser uma excelente ferramenta, o SQLCMD tem suas limitações &#8220;gráficas&#8221;, no entanto em alguns cenários é a ferramenta ideal!</p>
<p>Os exemplos que vou apresentar foram executados na minha estação de trabalho. Nela tenho instalado um SQL Server 2005. Minha instância é uma instância nomeada e é identificada como SQL05.</p>
<p>Pra começar a conversa vamos ao prompt de comando (menu Iniciar &gt; Executar &gt; cmd).</p>
<p>No prompt de comando, para conectar no meu SQL local (localhost), utilizando o SQLCMD, devo digitar o seguinte comando:</p>
<blockquote><p>sqlcmd –E  –S  LOCALHOST\SQL05</p>
</blockquote>
<p>No comando acima estou conectando no SQL Server utilizando a autenticação Windows (<strong>-E</strong>) na instância SQL05 (<strong>-S</strong>), mas se for necessário conectar utilizando a autenticação do SQL Server, ficaria assim:</p>
<blockquote><p>sqlcmd  –U SA –P senhateste –S  LOCALHOST\SQL05</p>
</blockquote>
<p>No exemplo acima, estou conectando no SQL utilizando o login SA  do SQL Server (<strong>-U</strong>) com a senha  <em>senhateste </em>(<strong>-P</strong>).</p>
<p>Se a conexão for realizada com <strong>sucesso</strong> o prompt do SQLCMD ficará similar à imagem abaixo:</p>
<p><img class="aligncenter size-full wp-image-405" title="01sqlcmd" src="http://silasmendes.com/dba/wp-content/uploads/2009/10/01sqlcmd.PNG" alt="01sqlcmd" width="344" height="99" /></p>
<p>Se o seu SQL Server foi instalado como uma instância padrão a conexão é ainda mais simples, pois você não precisa especificar o nome da instância. No exemplo abaixo estamos conectando numa instância padrão do SQL Server, utilizando autenticação Windows.</p>
<blockquote><p>sqlcmd –E</p>
</blockquote>
<p>Uma vez conectado, para sair do SQLCMD podemos utilizar os clássicos <strong>EXIT </strong>ou <strong>CTRL + C</strong>.</p>
<p>Dentro do SQLCMD é importante saber que suas instruções sql só serão executadas quando você digitar um <strong>GO </strong>e confirmar com um ENTER. No exemplo abaixo eu mudei o contexto para a base de dados Northwind e logo depois executei uma consulta. Veja que ao fim de cada instrução eu adicionei um GO.</p>
<h5><img class="aligncenter size-full wp-image-406" title="02sqlcmd" src="http://silasmendes.com/dba/wp-content/uploads/2009/10/02sqlcmd.PNG" alt="02sqlcmd" width="577" height="414" /><span style="font-weight: normal;">Note que a cada GO a numeração das linhas recomeça.</span></h5>
<p>Uma vez conectado, como já citado, você poderá executar qualquer instrução SQL desde <em>selects</em>, <em>updates</em>, até a criação de bancos e tabelas ou a execução de procedures do sistema que te auxiliem a monitorar seu SQL Server, como:</p>
<p>Ler log do SQL Server</p>
<blockquote><p>sp_readerrorlog</p>
<p>go</p>
</blockquote>
<p>Verificar conexões na instância:</p>
<blockquote><p>sp_who</p>
<p>go</p>
</blockquote>
<p>Etc…</p>
<p>Combinado a isto, é possível também <strong>executar comandos do DOS</strong> <strong>dentro do SQLCMD</strong>. Para listar o C:\ basta digitar</p>
<blockquote><p>!!dir C:\</p>
</blockquote>
<p>Se quiser dar uma limpada na tela, digite:</p>
<blockquote><p>!!cls</p>
</blockquote>
<p>Como você pode notar todos os comandos do prompt DOS são precedidos por dois pontos de exclamação (<strong>!!</strong>).</p>
<p>Ok&#8230;</p>
<p>Mas digamos agora que você tenha aí um script pronto e deseja executá-lo no SQLCMD, além disso deseja gravar o resultado da execução deste script num arquivo txt. Vamos exemplificar esta situação utilizando o script abaixo que será salvo na unidade c:\ num arquivo identificado como <strong>teste.sql</strong>.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">USE northwind</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SELECT</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>table_name nomeTabela,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>column_name nomeColuna,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>data_type tipoDaColuna,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>isnull(character_set_name, &#8216;NoUnicode&#8217;) campoUnicode</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">FROM</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>information_schema.columns</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">WHERE</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2126px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>table_name = &#8216;Categories&#8217;</div>
<blockquote><p>USE northwind</p>
<p>&#8211; lista todas as colunas da tabela Categories da base Northwind</p>
<p>SELECT</p>
<p><span style="white-space: pre;"> </span>table_name nomeTabela,</p>
<p><span style="white-space: pre;"> </span>column_name nomeColuna,</p>
<p><span style="white-space: pre;"> </span>data_type tipoDaColuna,</p>
<p><span style="white-space: pre;"> </span>isnull(character_set_name, &#8216;NoUnicode&#8217;) campoUnicode</p>
<p>FROM</p>
<p><span style="white-space: pre;"> </span>information_schema.columns</p>
<p>WHERE</p>
<p><span style="white-space: pre;"> </span>table_name = &#8216;Categories&#8217;</p>
</blockquote>
<p>Veja como fica a linha dessa chamada utilizando o SQLCMD:</p>
<p><img class="aligncenter size-full wp-image-407" title="03sqlcmd" src="http://silasmendes.com/dba/wp-content/uploads/2009/10/03sqlcmd.PNG" alt="03sqlcmd" width="687" height="23" /></p>
<h5><span style="font-weight: normal;"><span style="color: #999999;">sqlcmd -E -S LOCALHOST\SQL05 -i&#8221;c:\teste.sql&#8221; -o&#8221;resultado.txt&#8221;</span></span></h5>
<p class="MsoNormal">O parâmetro <strong>–i</strong> indica o arquivo de entrada (INPUT),  que contém o script que será executado. O parâmetro <strong>–o</strong> indica qual será o arquivo de saída (OUTPUT), que conterá o resultado da execução.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Como qualquer assunto no SQL Server, este é mais um que poderíamos discorrer por páginas e mais páginas&#8230; mas por enquanto ficamos por aqui. Creio que essa introdução é o suficiente pra entendemos o potencial <span style="mso-spacerun: yes;"> </span>desta ferramenta.</p>
<p class="MsoNormal">Para obter mais informações sobre os parâmetros do <strong>SQLCMD</strong>, no prompt do DOS digite <strong>sqlcmd -?</strong> Se esse help parecer um pouco confuso você poderá acessar este <a href="http://msdn.microsoft.com/pt-br/library/ms165702.aspx" target="_blank">link </a>e ter informações mais detalhadas.</p>
<p class="MsoNormal"> </p>
<blockquote><p class="MsoNormal">É importante lembrar que o SQLCMD está disponível para o SQL Server 2005 e 2008. Para versões anteriores utilize o <em>OSQL </em>ou <em>ISQL</em>.</p>
</blockquote>
<p class="MsoNormal">Bom trabalho, bons estudos!</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Mendes</p>
]]></content:encoded>
			<wfw:commentRss>http://silasmendes.com/dba/sql-server-via-prompt/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Calculando a idade usando T-SQL</title>
		<link>http://silasmendes.com/dba/calculando-a-idade</link>
		<comments>http://silasmendes.com/dba/calculando-a-idade#comments</comments>
		<pubDate>Tue, 01 Jul 2008 17:47:41 +0000</pubDate>
		<dc:creator>Silas Mendes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL SERVER 2000]]></category>
		<category><![CDATA[SQL SERVER 2005]]></category>
		<category><![CDATA[SQL SERVER 2008]]></category>
		<category><![CDATA[SQL SERVER 2008 R2]]></category>
		<category><![CDATA[SQL SERVER 7]]></category>
		<category><![CDATA[Traduzidos]]></category>
		<category><![CDATA[Calcular Data]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Sql Server]]></category>

		<guid isPermaLink="false">http://diariodba.wordpress.com/?p=9</guid>
		<description><![CDATA[O artigo abaixo foi escrito por Lynn Pettis para o site www.sqlservercentral.com. O texto original pode ser lido aqui. Como calcular a idade de uma pessoa? Isto pode tornar-se um tema polêmico e com inúmeras soluções. Mas antes de criticar este tópico considere que ele pode ajudar a definir algumas regras a serem utilizadas na [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="margin:0;"><strong> </strong></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:11pt;font-family:Arial;"> </span></p>
<p class="MsoNormal" style="margin:0;"><strong><em><span style="font-size:11pt;font-family:Arial;">O artigo abaixo foi escrito por Lynn Pettis para o site <a href="http://www.sqlservercentral.com" target="_blank">www.sqlservercentral.com</a>. O texto original pode ser lido <a title="Aqui" href="http://www.sqlservercentral.com/articles/T-SQL/63351/" target="_blank">aqui</a>.</span></em></strong></p>
<p class="MsoNormal" style="margin:0;"><strong><em><span style="font-size:11pt;font-family:Arial;"><br />
</span></em></strong></p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">Como calcular a idade de uma pessoa? Isto pode tornar-se um tema polêmico e com inúmeras soluções. Mas antes de criticar este tópico considere que ele pode ajudar a definir algumas regras a serem utilizadas na criação de um algoritmo que calcule a idade.</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">A parte mais difícil é saber o que fazer com os anos bissextos. Quando é que uma pessoa (objeto/documento) torna-se um ano mais velha? Neste pequeno artigo iremos definir que isto ocorre em 28 de fevereiro de anos não-bissextos.</p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:11pt;font-family:Arial;"> </span></p>
<p class="MsoNormal" style="margin:0;">Antes de mergulhar nos cálculos, vamos fazer alguns cálculos simples usando o SQL Server 2005.</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">Primeiro, vamos ver o que acontece quando adicionamos um ano às datas: <strong>28/02/2008</strong> e <strong>29/02/2008</strong>:</p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<blockquote>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">declare</span><span style="font-size:10pt;" lang="EN-US"> @data1 <span style="color:#0000ff;">datetime</span><span style="color:#808080;">, <span style="color: #000000;">@data2 <span style="color:#0000ff;">datetime</span></span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">set</span><span style="font-size:10pt;" lang="EN-US"> @data1 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20080228&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">set</span><span style="font-size:10pt;" lang="EN-US"> @data2 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20080229&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">select</span><span style="font-size:10pt;" lang="EN-US"> <span style="color:#ff00ff;">dateadd</span><span style="color:#808080;">(</span>yy<span style="color:#808080;">,</span> 1<span style="color:#808080;">,</span> @data1<span style="color:#808080;">),</span> <span style="color:#ff00ff;">dateadd</span><span style="color:#808080;">(</span>yy<span style="color:#808080;">,</span> 1<span style="color:#808080;">,</span> @data2<span style="color:#808080;">)</span></span></p>
</blockquote>
<p class="MsoNormal" style="margin:0;"><span lang="EN-US"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;">Resultado:</p>
<p class="MsoNormal" style="margin:0;"><span style="font-family:Arial;"><span style="font-size:small;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-family:Arial;"><span style="font-size:small;">2009-02-<strong>28</strong> 00:00:00.000  2009-02-<strong>28</strong> 00:00:00.000</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-family:Arial;"><span style="font-size:small;"> </span></span></p>
<p class="MsoNormal" style="margin:0;">Observem que adicionar um ano para ambas as datas, resultam na mesma data. Vamos ver então o que acontece quando adicionamos 4 anos:</p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<blockquote>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">declare</span><span style="font-size:10pt;" lang="EN-US"> @data1 <span style="color:#0000ff;">datetime</span><span style="color:#808080;">,<span style="color: #000000;">@data2 <span style="color:#0000ff;">datetime</span></span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">set</span> @data1 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20080228&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;" lang="EN-US"> </span><span style="font-size:10pt;color:#0000ff;">set</span><span style="font-size:10pt;"> @data2 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20080229&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;"> <span style="color:#0000ff;">select</span><span lang="EN-US"> <span style="color:#ff00ff;">dateadd</span><span style="color:#808080;">(</span>yy<span style="color:#808080;">,</span> 4<span style="color:#808080;">,</span> @data1<span style="color:#808080;">),</span> <span style="color:#ff00ff;">dateadd</span><span style="color:#808080;">(</span>yy<span style="color:#808080;">,</span> 4<span style="color:#808080;">,</span> @data2<span style="color:#808080;">)</span></span></span></p>
</blockquote>
<p class="MsoNormal" style="margin:0;"><span lang="EN-US"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;">Resultado:</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;"><span style="font-family:Arial;"><span style="font-size:small;">2012-02-<strong>28</strong> 00:00:00.000  2012-02-<strong>29</strong> 00:00:00.000</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-family:Arial;"><span style="font-size:small;"> </span></span></p>
<p class="MsoNormal" style="margin:0;">Veja que agora as datas são diferentes. Isto é o que esperávamos.</p>
<p class="MsoNormal" style="margin:0;">Agora vamos ver a função DATEDIFF e ver um pouco como ela trabalha:</p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<blockquote>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">declare</span><span style="font-size:10pt;" lang="EN-US"> @data <span style="color:#0000ff;">datetime</span><span style="color:#808080;">,<span style="color: #000000;">@date2 <span style="color:#0000ff;">datetime</span></span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">set</span> @data <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20080229&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;" lang="EN-US"> </span><span style="font-size:10pt;color:#0000ff;">set</span><span style="font-size:10pt;"> @date2 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20090228&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;"> <span style="color:#0000ff;">select</span><span lang="EN-US"> <span style="color:#ff00ff;">datediff</span><span style="color:#808080;">(</span>yy<span style="color:#808080;">,</span> @data<span style="color:#808080;">,</span> @date2<span style="color:#808080;">)</span></span></span></p>
</blockquote>
<p class="MsoNormal" style="margin:0;"><span lang="EN-US"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;">Resultado:</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">1</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">Ok, mas qual o resultado da próxima consulta?</p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<blockquote>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:#0000ff;">declare</span><span style="font-size:10pt;" lang="EN-US"> @data1 <span style="color:#0000ff;">datetime</span><span style="color:#808080;">,<span style="color: #000000;">@data2 <span style="color:#0000ff;">datetime</span></span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">set</span> @data1 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20081231&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;" lang="EN-US"> </span><span style="font-size:10pt;color:#0000ff;">set</span><span style="font-size:10pt;"> @data2 <span style="color:#808080;">=</span> <span style="color:#ff0000;">&#8217;20090101&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;"> <span style="color:#0000ff;">select</span><span lang="EN-US"> <span style="color:#ff00ff;">datediff</span><span style="color:#808080;">(</span>yy<span style="color:#808080;">,</span> @data1<span style="color:#808080;">,</span> @data2<span style="color:#808080;">)</span></span></span></p>
</blockquote>
<p class="MsoNormal" style="margin:0;"><span lang="EN-US"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;">Resultado:</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">1</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">Espere…Isso não está certo, não existe um ano de diferença entre essas datas, alguma coisa deve estar errada.</p>
<p class="MsoNormal" style="margin:0;">Como você pode ver a função DATEDIFF retornou o numero da diferença entre os anos e não o número real de anos entre as duas datas.</p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">Nós podemos usar esta informação para criar um T-SQL simples:<span style="font-family: 'Times New Roman';"> </span></p>
<p><span style="font-size:10pt;color:#0000ff;"> </span></p>
<blockquote>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:blue;font-family:&quot;" lang="EN-US">declare</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"><span style="color:#000000;"> @data_nascimento </span><span style="color:blue;">datetime</span><span style="color:gray;">, <span style="color: #000000;"><span style="color:#000000;">@idade </span><span style="color:blue;">int</span><span style="color:gray;">, <span style="color: #000000;"><span style="color:#000000;">@data_atual </span><span style="color:blue;">datetime</span></span></span></span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:blue;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"><span style="color:#000000;"> </span><span style="color:blue;">set</span><span style="color:#000000;"> @data_atual </span><span style="color:gray;">=</span><span style="color:#000000;"> </span><span style="color:red;">&#8217;2008-02-28&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"><span style="color:#000000;"> </span><span style="color:blue;">set</span><span style="color:#000000;"> @data_nascimento </span><span style="color:gray;">=</span><span style="color:#000000;"> </span><span style="color:red;">&#8217;2007-03-01&#8242;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"><span style="color:#000000;"> </span><span style="color:blue;">set</span><span style="color:#000000;"> @idade </span><span style="color:gray;">=</span><span style="color:#000000;"> </span><span style="color:fuchsia;">datediff</span><span style="color:gray;">(</span><span style="color:#000000;">yy</span><span style="color:gray;">,</span><span style="color:#000000;">@data_nascimento</span><span style="color:gray;">,</span><span style="color:#000000;">@data_atual</span><span style="color:gray;">)</span><span style="color:#000000;"> </span><span style="color:gray;">-</span><span style="color:#000000;"> </span><span style="color:blue;">case</span><span style="color:#000000;"> </span><span style="color:blue;">when</span><span style="color:#000000;"> @data_atual </span><span style="color:gray;">&lt;</span><span style="color:#000000;"> </span><span style="color:fuchsia;">dateadd</span><span style="color:gray;">(</span><span style="color:#000000;">yy</span><span style="color:gray;">,</span><span style="color:fuchsia;">datediff</span><span style="color:gray;">(</span><span style="color:#000000;">yy</span><span style="color:gray;">,</span><span style="color:#000000;">@data_nascimento</span><span style="color:gray;">,</span><span style="color:#000000;">@data_atual</span><span style="color:gray;">),</span><span style="color:#000000;"> @data_nascimento</span><span style="color:gray;">)</span><span style="color:#000000;"> </span><span style="color:blue;">then</span><span style="color:#000000;"> 1 </span><span style="color:blue;">else</span><span style="color:#000000;"> 0 </span><span style="color:blue;">end</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:blue;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:10pt;color:blue;font-family:&quot;">select</span><span style="font-size:10pt;font-family:&quot;"><span style="color:#000000;"> @idade</span></span></p>
</blockquote>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> </span></p>
<p class="MsoNormal" style="margin: 0;"><span style="color: #000000;">Conclusão</span></p>
<p class="MsoNormal" style="margin:0;">
<p class="MsoNormal" style="margin:0;">Este é apenas um método para calcular a idade de uma pessoa. Existem outras inúmeras formas que podem ser usadas. Tudo o que posso sugerir é que você use o método que melhor lhe atenda em cada situação.</p>
]]></content:encoded>
			<wfw:commentRss>http://silasmendes.com/dba/calculando-a-idade/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

