Categorias
banco de dados desempenho dicas sql server

Problemas de cache no SQL Server

Se voc?? estiver recebendo uma mensagem do tipo:

O SQL Server encontrou %d ocorr??ncia(s) de libera????o de armazenamento em cache para o cache ‘%s’ (parte do cache do esquema) devido ?? manuten????o do banco de dados ou opera????es de reconfigura????o.

ou

SQL Server has encountered %d occurrence(s) of cachestore flush for the ‘%s’ cachestore (part of plan cache) due to some database maintenance or reconfigure operations.

?? porque, segundo a MSDN, ao limpar o cache do plano gera uma recompila????o de todos os planos de execu????o subseq??entes e pode provocar uma queda repentina e tempor??ria no desempenho da consulta. Para cada armazenamento em cache limpo no cache do plano, aparece a mensagem supracitada.

Para resolver isso, basta ir no banco correspondente, clicar com o direito sobre ele e escolher Properties (Propriedades). Entre em Options (Op????es) e configure o Auto-Close (Fechamento Autom??tico) para False.

Categorias
banco de dados cloud server crystal reports dll erros iis locaweb plesk sql server windows

Mega Post de Erros

Lidar com erros ?? algo realmente muito chato… Chato demais! Esses dias fui convocado para fazer um certo trabalho de migra????o entre servidores. Um desses servidores era um Cloud Server Pro da Locaweb. Em muitos posts que aqui escrevi tem um pouco retratando sobre a Locaweb. Trabalho e j?? trabalhei muito com ela e sei de todos os seus passos e “artimanhas” de atendimento… O antigo Cloud Server foi at?? tranquilo de trabalhar, mas esse novo… Vamos aos problemas!

Uma dica que dou sempre quando algu??m quer contratar um servidor: leiam muito sobre os pr??s e contras. Os pr??s vejam no pr??prio site do prestador, os contras vejam nos relatos de usu??rios. No post a seguir n??o estou jogando a Locaweb contra a parede, apenas estou expondo erros que podem ser sanados de forma f??cil mas que burocraticamente ?? jogado para o cliente se virar (nos 30!).

Nesse Cloud Server vem embutido o Plesk. Em poucas palavras serve para gerenciar a hospedagem atrav??s de uma interface web. ?? uma boa ferramenta de ger??ncia, tem tudo para gerenciar sua hospedagem. S?? que esse demais gera ocupa????o demais (redund??ncia) de espa??o em disco. Dos 50 Gb que voc?? contrata, 40Gb ?? para o sistema operacional e 10Gb para seus arquivos. Sendo que dos 10Gb ?? para todos os seus arquivos, e-mails, banco de dados, etc. Ou seja, apenas usufrui dos 10Gb um pouco menos que 9Gb e olhe l??.

Bem, dizem que vem tudo preparado e instalado para usar… Verdade at?? certa parte! Quem est?? usando e ?? iniciante vai ver que ?? mil maravilhas. D?? para fazer o b??sico de tudo. O problema vem a seguir…

Um cliente contratou o Cloud Server gerenciado pelo cliente (ou seja, sobrou para o usu??rio final) e me passou para configurar e deixar no ponto de uso fazendo toda a migra????o e instala????o. Em um passe de m??gica surgem os problemas…

Os bancos de dados que vem s??o o MS SQL Server 2008 e o MySQL. N??o h?? interface para dump e recovery das bases for??ando a usar o Plesk para isso, mas n??o queria. Onde est?? o Management Studio 2008? Onde est?? o MySQL Workbench? Como vou fazer para migrar as bases? Gerar script de bancos gigantes? Nem pensar! Preciso instalar!

Mas como instalar esses aplicativos? Se fazer download, gera tr??fego. Se pedir para a Locaweb tem que pagar e se pedir, de gra??a, n??o instala! Lembrando que esses aplicativos, no m??nimo, s??o gratuitos e deveriam estar em uma zona em que os usu??rios pudessem obt??-los de forma f??cil e sem cobran??a. Pois bem, feito o download, hora de instalar. Abrindo o execut??vel (lembrando que tem que ser a da vers??o 64bits) d?? aviso de incompatibilidade. ?? preciso instalar o Service Pack 1 do SQL Server 2008 (mais tr??fego). Baixado o SP1 ?? preciso instal??-lo. Tranquilo e instalado sem problemas. Hora de instalar o Management Studio

Ao tentar abrir, outro problema?!?! ?? preciso do Framework 3.5! Incrivel… No Cloud Server vem instalado a vers??o 2.0 e 4.0 do Framework ASP.NET mas n??o tem a 3.5 ativado. Menos mal, porque no Windows Server 2008 ?? nativo, basta ativar. Realize os seguintes passos (retirado do Wiki):

  1. Clique em Start, Administrative Tools e selecione Server Manager;
  2. Na interface, clique em Features e clique em Add Features;
  3. Selecione a primeira op????o .NET Framework 3.5.1 Features e adicione todos seus dependentes;
  4. Conclua a instala????o do Framework.

Agora sim, tudo pronto! Vamos instalar o Management Studio. Clica no instalador e… Erro! Caramba… de novo!

TITLE: SQL Server Setup failure.
——————————-


SQL Server Setup has encountered the following error:


Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

A dica ??: feche o Windows Explorer! Por algum motivo, a instala????o do Management Studio n??o inicia quando o Windows Explorer estiver em aberto. Copie para a ??rea de Trabalho e abra o instalador… Agora sim! Depois de tanta malemol??ncia pelo menos iniciemos a instala????o. Para quem tem d??vidas e um passo-a-passo bem explicativo de como instalar o Management Studio, acesse aqui o post de Marcos dell Antonio. H?? uma dica bem interessante que pode confundir o usu??rio na hora da instala????o. Terminado a instala????o, menos um item da lista de afazeres.

Consegui conectar ao SQL Server local, criei as bases, usu??rios, fiz restores, configurei o backup, providenciei tudo o que tinha que fazer onde o Plesk jamais pensaria em um dia ser. Agora o principal, testar um website. Publiquei o site no IIS e abri o navegador para visualizar. Erro!

Could not load type ‘System.ServiceModel.Activation.HttpModule’ from assembly ‘System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.

Sabe o porqu?? disso? Eu instalei o ASP.NET 3.5 depois que eu j?? tinha a vers??o 4.0 instalada por causa do Management Studio ent??o gerou conflito nas DLL’s. Para resolver, fa??a o seguinte:

  1. V?? para a pasta C:WindowsMicrosoft.NETFramework64v4.0.30319;
  2. Execute o comando aspnet_regiis.exe -iru

Agora vamos testar! Abri o navegador e digitei o endere??o e… Mais erro!

There is a duplicate ‘system.web.extensions/scripting/scriptResourceHandler’ section defined

Mais conflitos! Se voc?? tiver outra vers??o do System.Web.Extensions instalado, devido ao ASP.NET AJAX por exemplo, a vers??o que est?? no GAC do sistema difere da que voc?? quer chamar ocorrendo ambiguidade. O correto seria alterar os assemblys mas como isso ?? muito trabalhoso e pode acontecer algum imprevisto para aqueles que n??o sabem manuse??-las, ent??o aconselho o seguinte: remova toda a sectionGroup do seu web.config ou comente-as:

<!–
<sectionGroup name=”system.web.extensions” type=”System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<sectionGroup name=”scripting” type=”System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<section name=”scriptResourceHandler” type=”System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
<sectionGroup name=”webServices” type=”System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<section name=”jsonSerialization” type=”System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”Everywhere” />
<section name=”profileService” type=”System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
<section name=”authenticationService” type=”System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
</sectionGroup>
</sectionGroup>
</sectionGroup>
–>

No caso comentei o sectionGroup do System.Web.Extension que pode estar na vers??o 1.0, 2.0 ou 3.5 que for.

Agora vamos l??! De p??s juntos e m??os dadas: Abre o navegador e… e… e… Funcionou! Depois de um ??rduo trabalho aparentemente tudo estava normal. Vamos testar outros sites e… e… e… Mais erros!

Quem ainda n??o est?? acostumado a trabalhar com Windows Server 2008 e IIS 7 ter?? que aprender muito sobre permiss??es e tratamento de erros. Incontestavelmente a tela do erro 500 ir?? aparecer e muito se sua aplica????o n??o estiver configurada adequadamente para o IIS 7. Nem sempre a mesma aplica????o que est?? no IIS 6 ir?? funcionar no IIS 7. Ent??o eis que surge a tela do Erro 500 Erro Interno do Servidor ou Error 500 Internal Server Error:



Ou ent??o:

D?? para descobrir o que ??? Vou dar a dica: revise seu web.config. “Ah, mas est?? tudo certo, n??o sei porque n??o funciona…”. Engano, est?? errado. J?? disse que o IIS 7 ?? chato, muito chato. O parser dele ?? muito minucioso e se n??o estiver nos padr??es vai dar problema.

Se voc?? n??o sabe utilizar bem o IIS e tem medo de alterar uma coisinha ali e outra acol?? vou dar a maior dica: saia abrindo cada op????o do painel da aplica????o at?? que uma delas acuse um erro de configura????o.

Por exemplo, abra o item Documento Padr??o. Se ele estiver configurado corretamente ent??o abrir?? a pr??xima tela normalmente. Se tiver algum erro, aparecer?? um alerta. Ent??o no web.config voc?? deve corrigir a sess??o correspondente. Ficou claro? Saia clicando um a um at?? que um deles se denuncie podendo ent??o fazer a corre????o.

O que ocorreu comigo foi que um site que estava no IIS 6 podia colocar a mesma p??gina (index.aspx) como padr??o, duas vezes, e n??o tinha problema. Quando foi para o IIS 7, na qual estava herdando a configura????o pai, e foi adicionar a p??gina index.aspx como padr??o novamente, ele dava erro e n??o sabia porqu??. Ent??o removi a entrada do web.config e funcionou. Desabilitar a mensagem de erro amig??vel no navegador vai funcionar (encontrar o erro)? N??o. Desabilitar as p??ginas de erros personaliz??veis do IIS vai funcionar (encontrar o erro)? Talvez ou n??o. Depende muito do ambiente que est?? configurado e quem est?? manipulando.

Pronto! Mais um problema solucionado… Vamos testar outro site e… e… e… Erro! Agora aconteceu um erro 404. Mas como? Erro 404 de p??gina n??o encontrada mas se o caminho est?? l??? Incrivelmente no IIS do Cloud Server possuem dois Applications Pools do Plesk (e mais outros nativos): Plesk(default)(2.0) e Plesk(default)(4.0). O pool do 2.0 quase nem sempre funciona. E um comportamento anormal ?? que se voc?? tem um site pai em 2.0 e um filho em 2.0 ??s vezes p??ra de funcionar. O “correto” ?? ter um pai 2.0 ou 4.0 com filho sempre 4.0. Estranho? Pode crer! E onde est?? o pool do 3.5? Tem que criar na m??o mesmo.

Nota: Se voc?? reiniciar o IIS o Plesk p??ra de vez e n??o volta:

Voc?? ter?? que inici??-lo manualmente. Mas antes ter?? que iniciar seu pool tamb??m (que ?? muito suspeito):

 Ajeitado uma coisinha ali, outra aqui, vamos testar mais algumas coisas e… e… e… Quase tudo certo. Em quest??o de funcionalidade (que deveria ser) est?? quase tudo certo a n??o ser o funcionamento do bom e velho Crystal Reports. Quem j?? leu o post de erros do Crystal aqui e aqui nos deparamos com o erro:

O inicializador de tipo de ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ acionou uma exce????o

ou

The type initializer for ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ threw an exception

Cuidado! Esse n??o ?? o descritivo do erro. S?? com isso n??o d?? para saber o motivo. Fa??a o debug, log,  exibi????o da pilha ou na pr??pria tela exiba o erro (sem ter AJAX) que teremos o erro completo. No link dos dois posts anteriores que fiz explica o problema do Crystal na plataforma 64bits e como pode resolver. S?? que o problema no meu caso era permiss??o.

Server Error in ‘/virtual_directory_name’ Application.
Error in File UNKNOWN.RPT:
The request could not be submitted for background processing.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.


Exception Details: System.Runtime.InteropServices.COMException: Error in File UNKNOWN.RPT: The request could not be submitted for background processing.

Os usu??rios listados abaixo, n??o tinham permiss??o na execu????o de scripts DCOM e grava????o em algumas pastas (principalmente as que est??o na unidade C):

  • IWAN_plesk(default)
  • IUSR
  • IIS_IUSR
  • NETWORK SERVICE
  • INTERACTIVE

Esses s??o os usu??rios que devem ter privil??gio (descritos abaixo) nas pastas listadas abaixo:

  • C:WindowsTemp : leitura escrita
  • C:Program Files (x86)Business ObjectsCommon2.8bin : leitura
  • C: : leitura

Obs: Para alguns servidores ?? preciso aplicar o Replace permission entries on all child objects nessas pastas.

Lembrando de reiniciar o IIS e/ou o servidor para recarregar as configura????es.

Se estiver trabalhando com Windows Service ou Windows Form e ocorra o erro:

System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {5FF57840-5172-4482-9CA3-541C7878AE0F} failed due to the following error: 8007007e

Basta compilar sua aplica????o em x86.

E agora, tudo certo? At?? o momento sim. Porque n??o dizer que est?? tudo OK? Depois de ter ocorrido todos esses problemas, fica-se receoso com o futuro. Pode ser que ocorra outro problema posteriormente? Sim e ir??.

Conforme disse anteriormente, o post n??o ?? para dizer mal sobre a Locaweb e/ou Plesk. Acho que eles prestam um servi??o adequado para o n??vel nacional (at?? uso) contudo s??o coisas que acontecem que simplesmente poderiam ser sanadas antes de jogar o pepino para o cliente. Se voc?? tiver algum problema desses e sua ger??ncia for pelo cliente, nem adianta pedir que eles v??o lhe informar: “o gerenciamento ?? por conta do cliente e n??o nos responsabilizamos” ou “a ferramenta (Plesk) ?? terceirizada e n??o prestamos suporte.”. Enfim, espero que o post ajude a voc??, cliente e usu??rio, a corrigir seus problemas/pepinos que ocorrerem. Isso me lembra quando lan??ou o plug-and-play… a velha piadinha do plug-and-pray (ligar e rezar) n??o some da cabe??a quando ocorre esse tipo de problema. Porque ser???

Categorias
dicas sql server

Melhorando o desempenho de consultas (SELECT) em tabelas grandes no SQL SERVER

“Tenho uma tabela com mais de um milh??o de registros. Fa??o uma consulta… um simples SELECT… mas est?? demorando muito para retornar. O que fazer?”

Essa ?? a pergunta que voc?? se faz nessa situa????o. Todo programador sabe trabalhar com banco, mas nem sempre sabemos utilizar da melhor forma. Um DBA j?? ?? craque na situa????o e sabe a melhor forma de melhorar o desempenho de uma consulta. A dica do dia ??: ??ndices! Se voc?? n??o sabe o que s??o ??ndices, veja essa mat??ria aqui de Thiago Pastorello que explica de forma bem compreensiva. Tamb??m recomendo que leia tamb??m esse artigo da Compute-rs onde explica as vantagens e desvantagens de usar ??ndices.

?? s?? isso? Talvez. Se voc?? entedeu o significado de ??ndices lendo os dois artigos (refer??ncia) e fez o que irei demonstrar abaixo pode ser que resolva. Na net voc?? ir?? encontrar outros artigos semelhantes que ir??o mostrar outros caminhos que podem ajudar melhor. Aqui ser?? de forma simplificada… Vamos?

Abra o Microsoft SQL Server Management Studio, conecte-se a base de dados e clique em New Query. Escreva a consulta que deseja avaliar e corrigir para ficar mais r??pida. No meu caso irei executar uma Stored Procedure que cont??m v??rias sub-consultas com manipula????o de agrupamento tais como COUNT, SUM, etc. Na barra de ferramentas marque a op????o Include Actual Execution Plan (Incluir Plano de Execu????o Atual).

Agora clique em Execute ou pressione F5 para executar a query e avali??-la. Aguarde at?? que finalize completamente. V?? na ??ltima aba abaixo de Plano de Execu????o e veja os resultados.

Passando o mouse por cima de cada item ir?? ser exibidos detalhes acerca do custo de processamento. Depois procurem ai no Google mais explica????es sobre cada item. Mas vamos nos atrelar a essa mensagem verde. Note que o pr??prio SQL Server informa que h?? indices ausentes! Vamos cri??-los?

Clique com o direito sobre a mensagem e escolha Detalhes de ??ndices Ausentes.

Ao clicar, ir?? aparecer outra tela com um query de cria????o do ??ndice, exemplo:

/*
Detalhes de ??ndice Ausentes de SQLQuery1.sql – SERVIDOR.Mailing (thiago (53))
O Processador de Consultas estima que a implementa????o do ??ndice a seguir pode melhorar o custo da consulta em 99.7047%.
*/
/*
USE [Mailing]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[News_Envio] ([id_campanha])
GO
*/
 
A consulta de cria????o est?? praticamente pronta bastanto apenas dar um nome para o ??ndice e remover o coment??rio, deixando da seguinte forma:
 
USE [Mailing]
GO
CREATE NONCLUSTERED INDEX PI_Index_Envio_Campanha
ON [dbo].[News_Envio] ([id_campanha])
GO

Pressione F5 ou Execute esse bloco de instru????es para criar o ??ndice. Antes de testarmos, vamos atualizar os ??ndices e suas estat??sticas.

V?? na tabela desejada, na op????o de ??ndices e escolha Reorganizar ??ndices. Veja o n??vel de fragmenta????o e d?? OK. Em seguida execute:

UPDATE STATISTICS News_Envio

No caso substitua News_Envio pelo nome de sua tabela. Agora execute novamente o primeiro processo e ver?? um ganho significativo de velocidade de consulta. O que levava 1 minuto para executar, em menos de 1 segundo obt??m-se o resultado. Bom n???

Aprecie com modera????o o uso de ??ndices e leiam as refer??ncias para saber quais situa????es onde ?? vantagem ou n??o o uso deles.

Categorias
backup exporta????o importa????o sql server

Exportar Banco de Dados (BAK ou MDF) do SQL Server 2008 para o 2005

A forma mais f??cil de transferir um banco para outro ?? fazer um BAK dele e depois recuperar do outro lado. Do 2005 para o 2008 ?? poss??vel realizar a recupera????o, mas do 2008 para o 2005 n??o ?? poss??vel realizar o downgrade. Qual a solu????o? Gerar o script geral do banco e execut??-lo no banco de destino. Mas se meu banco ?? muito grande, como fazer? A dica est?? no final do post, mas fa??amos tudo desde o in??cio.
Abra o SQL Server Management Studio (ou Express) e conecte-se ao Server. Clique com o bot??o direito sobre a base de dados e siga em Task (Tarefas) e escolha Generate Scritps (Gerar Scripts). Na tela de sele????o de base, marque a op????o Script all objects in the selected database (Scritp de todos os objetos da base selecionada) e avance. Nessa pr??xima tela procure os itens abaixo e atribua os seguintes valores:

  1. Script for Server Version (Vers??o de Script do Server): SQL Server 2005
  2. Script Data (Script de Dados): True
  3. Script USE DATABASE: False

Demais op????es fica a seu crit??rio optar… Agora avance e na pr??xima tela escolha salvar o arquivo em disco com as op????es Simples (Single file) e Unicode text. Avance, revise o que foi selecionado e finalize. Aguarde at?? que o processo seja finalizado. Quando terminado seu script j?? estar?? pronto para ser executado no destino.
O pr??ximo passo ?? executar o script gerado na base de destino. Crie a base de destino vazia e agora temos duas op????es:

  • Se o script gerado for pequeno (ou seja base pequena) podemos simplesmente abrir pelo pr??prio SQL Server Management e executar como se fosse Querys consecutivas;
  • Se o script for grande vamos usar um artif??c??o para isso.

Como a primeira op????o ?? a mais simples (e tamb??m porque gosto de aventurar-me) vamos optar pela segunda (e que tamb??m ?? nossa realidade). No meu exemplo, o script gerado ficou em torno de 1,5Gb. Se desejar reduzir o tamanho um pouco, ??s vezes, reduzir o log ajuda (saiba como reduzir aqui) antes de gerar o script.
Abra o Prompt de Comando (emulador do DOS no Windows) e digite o seguinte comando:

sqlcmd -U thiago -P blog -S THIAGOMARCALSQLEXPRESS -d BaseBlog -i C:ScriptSQL.sql -o C:LogExecucao.txt

Explicando os atributos:

  • U: informa o nome do usu??rio que est?? conectando (no caso, o usu??rio thiago);
  • P: informa a senha do usu??rio (a senha ?? blog);
  • S: nome do servidor (como est?? na minha m??quina a inst??ncia ?? THIAGOMARCALSQLEXPRESS);
  • d: nome da base nova que receber?? o resultado do script (BaseBlog ?? o nome da nova base criada);
  • i: local onde salvei o script de dados e que usarei como entrada;
  • o: arquivo de texto contendo o resultado da opera????es (log para an??lise – opcional).

D?? ENTER e aguarde toda a opera????o ser executada. Para quaisquer tamanho do arquivo ele ser?? processado sem problemas. Se tentasse abrir pelo SQL Server um arquivo muito grande daria erro de aloca????o de mem??ria, ou demoraria e nem conseguiria executar exibindo alguns dos seguintes erros:

  • Cannot Open Datafile
  • Insufficient memory
  • Out of Memory Exception

Dessa forma ?? mais tranquilo…

Categorias
clr dicas dll sql server visual studio

Utilizando fun????o de uma DLL Externa no SQL Server

Esse ?? um t??pico que ir?? mostrar algo que definitivamente voc?? j?? precisou mas n??o sabia como fazer e que facilitar?? (e muito) alguns trabalhos. Programadores que usam o Bando de Dados para programar sendo por Stored Procedure, Functions e Triggers j?? passaram por maus bocados para preparar um algoritmo que realizasse um determinado processo, mas que esse mesmo algoritmo ?? mais f??cil de ser escrito (ou possuir funcionalidades que o SGDB n??o possui) em outra linguagem de programa????o. Por exemplo: validar e-mail. ?? poss??vel no SQL Server fazermos um Function que receba um VARCHAR e retorne um BIT informando que um e-mail ?? v??lido ou n??o, contudo seria uma fun????o um tanto que trabalhosa para quem n??o est?? familiarizado com programa????o em banco. Para quem desenvolve em ASP.NET (C# ou VB.NET) basta usarmos express??o regular que, em duas linhas, resolve o problema. Portanto iremos utilizar uma fun????o escrita em C# compilada em uma DLL e usarmos em um Function no SQL Server. Isso ?? poss??vel atrav??s do CLR.
Primeiramente vamos criar a DLL contendo a fun????o (no nosso exemplo vamos fazer a que valida e-mail – mas voc?? pode desenvolver a que quiser). Abra o Visual Studio e crie um Project. Em Project Type escolha Visual C# Windows e o Template opte por uma Class Libary. Note que quando voc?? cria uma classe vem com o nome Class1.cs. Para facilitar a compreens??o, renomeie para FuncoesSql.cs (ou outra) e remova o namespace criado. Agora, escreva a fun????o que deseja e adicione os namespaces necess??rios ficando da seguinte forma:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class FuncoesSql
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean IsMailValido(SqlString email)
    {
        // Cria um objeto de express??es regulares para validar e-mail
        Regex expressaoRegular = new Regex(@”^(([^<>()[]\.,;:s@””]+”
        + @”(.[^<>()[]\.,;:s@””]+)*)(“”.+””))@”
        + @”(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”
        + @”.[0-9]{1,3}])(([a-zA-Z-0-9]+.)+”
        + @”[a-zA-Z]{2,}))$”);

        // Realiza um teste na valida????o da express??o
        return new SqlBoolean(expressaoRegular.IsMatch(email.ToString()));
    }
}

No caso, precisamos explicitar os tipos de entrada e sa??da utilizados pelo banco de dados para que n??o haja problemas de tipagem. Poderia ser qualquer fun????o ou quantas que quisesse, contanto que respeite os tipos. Agora compile a DLL pressionando F6 ou pelo menu Build. J?? temos a DLL com a fun????o. Copie a DLL (que est?? na pasta binDebug de sua solu????o) e coloque-a em um local onde seu Banco de Dados possa busc??-la. Para exemplo, colocarei em C:SqlDlls no Servidor.
O pr??ximo passo ?? verificar se no SQL Server est?? ativo a funcionalidade CLR, para isso v?? em Iniciar > Todos os Programas > Microsft SQL Server 2008 (ou 2005) > Configuration Tools > SQL Server Surface Area Configuration. Entre em Surface Area Configuration for Features e na guia CLR Integration verifique se a fun????o est?? habilitada. Se n??o estiver, habilite.

D?? OK e agora j?? poder?? usar CLR no SQL Server. Abra o SQL Server Management Studio, conecte-se na base desejada e execute as seguintes instru????es SQL (abra um New Query para isso):

— CRIA O ASSEMBLY INDICANDO SUA ORIGEM
CREATE ASSEMBLY FuncoesSql FROM ‘C:SqlDllsFuncoesSqlServerASPNET.dll’
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— CRIA A FUN????O
CREATE FUNCTION dbo.Fun_Valida_Mail (@email NVARCHAR(350))
RETURNS BIT
— INDICA A ORIGEM DA FUN????O SQL: ASSEMBLY > CLASSE > FUN????O
AS EXTERNAL NAME [FuncoesSql].FuncoesSql.IsMailValido
GO

Agora execute a Query (ou pressione F5)… Foi criada a fun????o! Pronto… agora ?? s?? usar como se fosse uam fun????o do SQL Server normalmente. Abaixo tem alguns exemplos de consulta e seus retornos:

Execu????es:
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail.com’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal.. @gmail.com’)
 
Retorno:
0
1
0
 
Apesar do trabalho inicial, pode-se aproveitar muito de ambos os recursos e criar cada vez mais fun????es complexas. Quanto ao desempenho da CLR, em compara????o ao T-SQL, deve-se ficar a mesma coisa. A diferen??a ?? praticamente impercept??vel. Espero que tenham gostado… At?? breve!

Categorias
dicas sql server

Dicas de Instru????es SQL para facilitar o uso no dia-a-dia

Bom, abaixo separei algumas instru????es SQL que muitos programadores tem d??vidas de como us??-las e que facilitam muitas tarefas.

1) INSERT de SELECT: Fazer inser????es em uma tabela puxando dados de outra(s)

Bem parecido com o SELECT INTO por??m voc?? pode fazer v??rias manipula????es conforme desejar usando um simples SELECT. No caso vou mostrar um exemplo bem f??cil: irei adicionar v??rios Alunos numa tabela sendo que os dados est??o em outra tabela (Cadastros), logo minha instru????o ficaria assim:

INSERT INTO Alunos (nome, email) SELECT nome, email FROM Cadastros

O nome dos campos n??o precisam serem iguais, basta estar na mesma ordem e respeitar o tipo de dados (tamanho tamb??m).

2) UPDATE relacionado com outra tabela

Nessa situa????o o que desejamos ?? fazer um UPDATE na tabela sendo que ?? preciso fazer um JOIN com outra tabela. No nosso exemplo: desejamos alterar o preco de um produto sendo que o valor do mesmo est?? relacionado com seu tipo e ele est?? armazenado em outra tabela. Logo podemos usar a seguinte instru????o:

UPDATE Produto SET preco = T.preco FROM Produto AS P, Tipo AS T WHERE P.Id_Tipo = T.Id

Meio complicado quando se v??, n??? Mas se voc?? reparar detalhadamente ver?? que a atualiza????o do pre??o ?? feita, para cada produto, quando o Id_Tipo (da tabela Produto) for igual ao Id (da tabela Tipo) obtendo assim o preco (da tabela Tipo).

3) Remover registros duplicados deixando apenas um

A explica????o desse objetivo ?? bem ??bvia: remover registros duplicados em uma determinada tabela sob,algum crit??rio. Por??m, sua sintaxe ?? mais complicada, mas vamos l??… Para nosso exemplo iremos remover os registros duplicados (ou mais que um) de e-mails deixando apenas um na tabela Mailing:

;WITH Listagem(email, ranking)
AS
(
SELECT email
,ranking = DENSE_RANK() OVER(PARTITION BY email ORDER BY NEWID() ASC)
FROM Mailing WITH (NOLOCK) WHERE email IS NOT NULL 
)
DELETE Listagem WHERE ranking > 1

Esse emaranhado de instru????es se resume em gerar um ranking indicando quantas vezes o registro se repete. Esse ranking ?? armazenado em uma tabela “tempor??ria” (tabela Listagem) com refer??ncia ?? original (tabela Mailing)… Logo que ?? gerado o ranking, ?? feita a exclus??o dos registros que possuem ranking maior que 1, ou seja, apaga todos aqueles que est??o se repetindo deixando apenas um deles.

Bem, ?? isso! Espero ter ajudado… Lembrando que os exemplos acima foram os mais simples e voc??s podem encontrar situa????es semelhantes ou piores mas que, usando-os, podem ajudar a chegar na resolu????o.

Categorias
dicas mem??ria sql server

Problema no uso de mem??ria no SQL Server 2008

Se em algum momento, quando em trabalho, estiver recebendo uma das seguintes mensagens abaixo, voc?? est?? tendo s??rios problemas de uso de mem??ria:

“There is insufficient system memory in resource pool ‘internal’ to run this query” *
ou
“H?? mem??ria de sistema insuficiente no pool de recursos internos para executar essa consulta” *

Isso ocorre quando h?? v??rias instru????es SQL sendo executadas em seq????ncia. Como o pool n??o aguenta, os dados, em algumas vezes, podem travar… Mesmo que fisicamente eles estejam l??, n??o se pode mais ser utilizados at?? que o banco seja reiniciado. Para corrigir esse problema h?? duas formas: instalar o hotfix que a Microsoft disponibilizou ou reduzir quantidade de instru????es a serem executadas por vez.

1) Instalar o HotFix

O arquivo est?? dispon??vel em um pack cumulativo p??s SP1 do SQL Server 2008. Para mais informa????es e download, clique aqui.

2) Reduzir a quantidade de instru????es SQL

Fazendo um teste de v??rios UPDATE’s seguidos, consegui obter tal erro. Gerei um arquivo .sql com quase 100mil updates e mandei o SQL Server executar, da?? obtive o erro. Nunca tente isso! Se desejar executar v??rios UPDATE’s ou INSERT’s de vez fragmente a execu????o das instru????es em blocos (nem t??o grandes e nem t??o pequenos) dando uma pausa entre as execu????es. Pode-se utilizar uma Store Procedure buscando os dados em um tabela tempor??ria e executar a instru????o de forma gen??rica (INSERT com SELECT, por exemplo). Tamb??m pode-se usar um artif??cio do ASP.NET, Batch Update, para executar a instru????o de forma gen??rica com alto desempenho.

* A depender da configura????o do SQL Server, ao inv??s de ser o recurso interno (ou internal) pode ser o recurso default.

Categorias
banco de dados log sql server

Reduzir Log SQL Server

Nesse primeiro post sobre SQL Server vou explicar como reduzir o log do SQL Server 2005 e 2008. No log cont??m as instru????es que foram executadas ultimamente no banco de dados. Para quem trabalha com recupera????o em log pode preferir manter o log por algum per??odo antes de fazer uma redu????o. Mas para outros bancos de dados que realizam inser????es e atualiza????es constantes pode ficar invi??vel manter o log por grandes per??odos devido a prover um crescimento exarcebado. Bem isso voc?? pode ver melhor a depender da pol??tica de backup que voc?? for utilizar. Considerando que o log para voc?? n??o tem import??ncia de mant??-lo por muito tempo e n??o quer mexer nas configura????es no SQL Server, essa ?? uma boa dica de fazer a redu????o atrav??s de comandos SQL.

Pelo pr??prio SQL Server Management Studio voc?? pode utilizar da fun????o Shrink e fazer a redu????o do banco de dados e log. Muitas vezes a redu????o (vamos nos atentar ao do log) chega a ser pouca pois ele mant??m ainda algumas das instru????es mais recentes. Mas para for??osamente realizar a redu????o execute a seguinte intru????o:

SQL Server 2005
USE Banco_Dados
GO
BACKUP LOG Banco_Dados WITH TRUNCATE_ONLY
DBCC SHRINKFILE (Banco_Dados_log, 1)

SQL Server 2008
USE Banco_Dados;
GO
ALTER DATABASE Banco_Dados
SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE (Banco_Dados_Log, 1);
GO
ALTER DATABASE Banco_Dados
SET RECOVERY FULL;
GO
 
Ambos os procedimentos fazem com que o log seja reduzido a 1Mb. Nota-se que a instru????o de redu????o ?? a mesma. A ??nica diferen??a ?? que para realizar a trucamento, no 2005 ?? preciso informar que o backup de log ser?? truncado explicitamente e no 2008 deve mudar o status para recupera????o simples antes de trunc??-lo. Se quiser realizar o truncamento autom??tico de todos os bancos do servidor basta fazer um SELECT com cursor sobre todos os bancos pegando o name deles e executando o script acima. Mas isso deixarei para mostrar outro dia…