Novos projetos

Estou trabalhando num novo projeto e infelizmente não tenho encontrado muito tempo pra escrever por aqui. Tenho várias novidades pra postar e até semana que vem teremos novos posts.

Por enquanto um bom fim de semana pra todos 🙂

MCAD, MCSD, MCDBA

 

Pra você que ainda não concluiu e quer obter as certificações MCAD, MCSD ou MCDBA fique atento pois os exames para estas certificações estarão disponíveis somente até 31 de Março de 2009.

A boa notícia é que a Microsoft está oferecendo um desconto de 40% para esses exames; sem dúvidas uma ótima motivação 🙂

 

Bom estudo!

 

Consultando Metadados

 

Durante o processo de desenvolvimento é comum realizar consultas a metadados, ou seja, consultas que retornam informações sobre o próprio banco; algo como a consulta abaixo,  que retorna todas as tabelas de um determinado banco, junto com o nome de suas colunas e o tipo de dados:

SELECT

      t.name      nome_tabela,

      c.name      nome_coluna,

      ty.name     tipo_dado

FROM

      sysobjects t, syscolumns c, systypes ty

WHERE

      t.id = c.id AND

      t.type = ‘U’ AND

      c.xtype = ty.type

 

 

Isto está errado?

Não.

No entanto não é uma boa prática realizar consultas diretamente nas tabelas de sistema. Além do esforço em entender a estrutura dessas informações e construir a query, existe a possibilidade de no futuro a Microsoft alterar a estrutura de umas dessas tabelas. E aí? O que acontece com sua aplicação que estava buscando dados naquela estrutura?

Para evitar esse tipo de problemas o Microsoft SQL Server oferece um catalogo de views de metadados (desenvolvidas de acordo com os padrões ISO); a idéia é que essas views sempre retornarão os dados independente da versão do SQL Server, logo se houverem mudanças nas tabelas de sistema, sua aplicação não será afetada porque ela está buscando dados de uma view, além disso, a forma de consulta é muito simples. Veja só:

Se você quer obter os mesmos dados da consulta acima utilizando uma dessas views, precisa somente disso:

SELECT

      TABLE_NAME, COLUMN_NAME, DATA_TYPE

FROM

      INFORMATION_SCHEMA.COLUMNS

Veja como é mais simples.

Quer consultar todas as tabelas de sua base que comecem com tb_pedido? Então tente isso:

 

SELECT

      TABLE_NAME

FROM

      INFORMATION_SCHEMA.TABLES

WHERE

      TABLE_NAME like ‘tb_pedido%’

 

Se quiser consultar todas as procedures que iniciam com ‘listar%’ utilize:

SELECT

      *

FROM

      INFORMATION_SCHEMA.ROUTINES

WHERE

      SPECIFIC_NAME like ‘listar%’ and ROUTINE_TYPE = ‘PROCEDURE’

Além destas existem outras views que podem te auxiliar na consulta a metadados. Veja uma  lista completa aqui.

Bom trabalho!

 

 

 

 

Convertendo dados – CAST ou CONVERT?

 

Já ouvi diversas pessoas perguntarem a diferença entre o CAST e CONVERT, e às vezes coisas comuns passam despercebidas. A idéia é a mesma: as duas funções permitem converter um tipo de dado em outro, no entanto a função CAST é padrão ANSI, então teoricamente ela pode ser usada em qualquer SGBD; já a função CONVERT é uma função T-SQL, ou seja, específica do Microsoft SQL Server. Além desta diferença, a função CONVERT tem um opcional que permite a conversão do dado e a possibilidade de formatar o resultado, é o que chamamos de estilo, e isso é muito útil quando você trabalha com datatypes datetime e money/float.

Então, por exemplo,  se você quiser converter uma data e deixá-la no formato dd/mm/aaaa deve usar o CONVERT:

select CONVERT(varchar(60), current_timestamp, 103)

No exemplo acima estamos pegando a data atual e convertendo para VARCHAR e formatando a data como dd/mm/aaaa. A formatação neste caso está utilizando o estilo 103.

Uma tabela completa com os estilos disponíves pode ser acessada neste link: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Bom trabalho 🙂

 

Instalando o SQL SERVER 2008 (Parte I)

Ontem baixei a versão final do SQL Server 2008 e instalei aqui.

A versão é a Enterprise (Trial)  e tive dois problemas durante a instalação.

Um foi bem curioso, antes de iniciar a instalação o instalador informou que não poderia prosseguir porque existiam ferramentas do SQL Server 2005 Express instaladas e que para continuar a instalação eu deveria removê-las. O detalhe é que eu nunca instalei nenhuma versão Express nessa estação(!).

“The SQL Server 2005 Express Tools are installed. To continue, remove the SQL Server 2005 Express Tools.”

Ok… numa pesquisa rápida no fórum da Technet encontrei outros caras que já tiveram o mesmo problema e fiquei surpreso ao saber que o problema era devido a uma ferramenta que instalei, a SQL Prompt da Red Gate (essa ferramenta adiciona Intellisense no Query Analyser e SSMS). Bom, removi a ferramenta e o processo continuou normalmente…

…até eu encontrar outro erro, e infelizmente mais preocupante que o primeiro.

The Windows Installer service cannot update the system file C:\WINDOWS\system32\msxml6r.dll because the file is protected by Windows.  You may need to update your operating system for this program to work correctly.

Nas buscas pelo google e technet vi que o assunto está sempre relacionado ao Windows XP e o SP2… vou começar alguns testes hoje a tarde. Se alguém aí já viveu essa situação e tem uma sugestão de como resolver deixe sua contribuição 🙂

Editado: Solução para este problema neste post:https://diariodba.wordpress.com/2008/11/04/instalando-o-sql-server-2008-parte-ii/

Tutorial: Instalando o SQL Server 2008 Express.

Comparando text / ntext

 

No SQL Server 2005 temos os novos campos do tipo VAR…(MAX) que vieram aliviar o trabalho de muita gente. Um dos problemas mais comuns na versão anterior (2000) é quando precisamos comparar dados de campos do tipo text ou ntext, aí nos deparamos com um erro do tipo:

Server: Msg 306, Level 16, State 1, Line 1

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Eu já vivi essa situação algumas vezes e deixo aqui a forma como tentei resolver (Se tiverem outras sugestões fiquem a vontade para expor, ok?).

(Não fiz testes de perfomance nessa solução, o foco está somente em comparar as colunas tipo text / ntext.)

Imagine que eu tenha duas tabelas:

CREATE TABLE #tb_msg_tela
(id INT IDENTITY(1,1), texto TEXT)

GO

CREATE TABLE #tb_msg_impressao
(id INT IDENTITY(1,1), texto TEXT)

Com os seguintes dados:

INSERT INTO #tb_msg_tela VALUES (NULL)
INSERT INTO #tb_msg_tela VALUES (‘Campo text’)
INSERT INTO #tb_msg_tela VALUES (‘Teste comparação‘)
INSERT INTO #tb_msg_tela VALUES (‘Se caísse para o exterior, para o limite do universo, encontraria uma perto e pôsteres que indicassem BECO SEM SAÍDA?’)

INSERT INTO #tb_msg_impressao VALUES (”)
INSERT INTO #tb_msg_impressao VALUES (‘Campo text’)
INSERT INTO #tb_msg_impressao VALUES (‘Teste comparacao‘)
INSERT INTO #tb_msg_impressao VALUES (‘Se caisse para o esterior, p/ o limite do universo, encontraria uma perto e pôsteres que indicassem BECO SEM SAÍDA?’)

Observe que existem diferenças em alguns textos (em vermelho).

Para realizar o relacionamento das duas tabelas e encontrar os campos diferentes não podemos simplesmente utilizar:

SELECT * FROM #tb_msg_tela a, #tb_msg_impressao b
WHERE a.id = b.id AND a.texto <> b.texto

Essa consulta retornará um erro porque estamos comparando os campos text utilizando o <>.

Então o primeiro passo é encontrar o maior texto nessa coluna, para isso podemos usar as funções DATALENGHT e MAX:

SELECT MAX(DATALENGTH(texto)) FROM #tb_msg_tela
SELECT MAX(DATALENGTH(texto)) FROM #tb_msg_impressao

O resultado será:

———–

658

———–

656

Então sabemos que o maior texto dessa coluna não ultrapassa 700 caracteres, logo, podemos utilizar esse número como apoio no próximo passo, onde utilizaremos a função SUBSTRING:

SELECT
                *
FROM  
                #tb_msg_tela a,
                #tb_msg_impressao b
WHERE
                a.id = b.id
                AND ISNULL(SUBSTRING(a.texto, 0, 700),”) <> ISNULL(SUBSTRING(b.texto, 0, 700),”)

 

A função ISNULL é importante pois sem ela os campos Nulos serão ignorados.

Veja que a consulta só ira retornar os campos com as diferenças.

É um processo simples, mas que pode dar dor de cabeça por conta das limitações do tipo de dados. Pra quem ta iniciando o desenvolvimento utilizando o SQL Server 2005 a recomendação é: substitua os datatypes ntext, text, image por nvarchar(Max), varchar(Max) e varbinary(Max). Além de outras vantagens, com os novos datatypes não existem as antigas diferenças entre varchar e text.

 

Reduzindo tráfego com SET NOCOUNT ON

Uma dica:

 

Ao executar uma procedure o SQL Server retorna para a aplicação o total de linhas afetadas.

Ex: (1 row(s) affected)

 

Para evitar esse tráfego (que custa no seu tempo de resposta) coloque sempre no início de suas procedures a cláusula SET NOCOUNT ON.

Na maioria das vezes esse número é aparentemente irrelevante,  mas imagine sua aplicação executando uma proc que faça centenas ou milhares de operações (INSERT, UPDATE, etc) diversas vezes num dia…

Como dizem os mais velhos, de grão em grão a galinha enche o papo, na nossa realidade, de mili em milisegundos o seu banco também 🙂

Bom trabalho!

Segunda chance de volta!

Pessoal,

Está de volta a promoção Segunda Chance da Microsoft.
Pra quem não conhece, é o seguinte, se você deseja realizar uma prova pra certificação Microsoft, se for reprovado poderá fazer uma nova prova sem custos adicionais.

Para se inscrever é só clicar na imagem abaixo:

Microsoft - Segunda Chance

Microsoft - Segunda Chance

Bons estudos!

SQL Server 2005 – Erro Import/Export

Os dias estão bem corridos e só hoje pude resolver aquele problema da importação via interface (SSMS) que ocorreu na semana passada. A mensagem de erro completa é esta:

The SSIS Runtime object could not be created. Verify that DTS.dll is available and registered. The wizard cannot continue and it will terminate.

Unable to cast COM object of type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.PackageNeutralClass’ to interface type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSContainer90’.

Procurei na internet e muita gente sugeriu a reinstalação das ferramentas, no entanto encontrei uma solução mais curta que resolveu de imediato, apenas registrei a dll, veja:

No menu Iniciar > Executar

regsvr32.exe  “C:\Arquivos de programas\Microsoft SQL Server\90\DTS\Binn\DTS.dll”

e enter 🙂

Pronto!

BULK INSERT

Realizar tarefas utilizando interface e nosso amigo (mickey) mouse pode ser muito confortável, no entanto, nem sempre elas estão disponíveis ou em alguns cenários podem não ser a solução mais adequada.

Hoje pela manhã precisava importar dados para uma de nossas bases, a tarefa era urgentíssima, mas como sabemos é justamente nessas horas que dá tudo errado! Meu Management Studio acordou mal humorado e quando cliquei na opção importar ele disse sem pestanejar:

Unable to cast COM object of type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.PackageNeutralClass’ to interface type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSContainer90’ (…)

“Putz. Ok, hoje é sexta-feira, posso ir no Google e pesquisar sobre esse (maldito) erro”. Enquanto pensava nisso meu querido gerente liga perguntando: “Já importou os dados?”…

Ok, vamos deixar o Google pra lá (por enquanto).

Existe uma forma muito prática de importar dados no SQL Server e foi a ela que recorri, o comando T-SQL é o BULK INSERT e é bem simples, veja o exemplo:

 

BULK INSERT tb_unidade_taxas FROM ‘C:\arquivos_temp\tx_unid.txt’

WITH

      (

      FIRSTROW = 2,

      FIELDTERMINATOR =‘;’

      );

 

Neste caso o arquivo que eu precisava importar era o tx_unid.txt e ele foi gravado em C:\arquivos_temp do meu servidor SQL. Os dados desse arquivo foram importados para a tabela [tb_unidade_taxas] e como ele tinha algumas particularidades tive que informar no BULK INSERT que ele deveria ignorar a primeira linha (era uma linha com descrição das colunas) e o caractere o que separava um campo do outro era o ponto-e-vírgula (FIELDTERMINATOR =’;’).

 

Pronto! Arquivo importado.

O BULK INSERT tem diversos parâmetros que você pode conferir aqui.

 

Em outra oportunidade irei comentar outras vantagens da utilização do BULK INSERT e também pretendo comentar sobre o BCP, mas agora vou ao Google ver se encontro o remédio pro mau humor do meu Management Studio 🙂

 

Até +