quinta-feira, 31 de março de 2011

Microsoft WebSiteSpark

O WebsiteSpark é um programa criado pela Microsoft para impulsionar desenvolvedores que utilizem sua plataforma para criação de web sites e aplicações web.

Através deste programa, a Microsoft oferece gratuitamente diversas de suas ferramentas voltadas para o desenvolvimento e até mesmo para servidores de Produção entre eles o SQL Server Web Edition. Os participantes podem fazer o download dos softwares diretamente do site do programa, basta preencher um cadastro informando os detalhes da empresa onde trabalha.

Além dos softwares gratuito, os participantes do WebsiteSpark têm acesso a materiais de estudo e podem ligar-se a empresas parceiras da Microsoft, criando boas oportunidades de negócio.

A iniciativa é voltada para pequenas empresas (com até 10 colaboradores).

Para mais informações, acesse:

 
Antes de efetuar o cadastro, leia atentamente o regulamento do programa.

quarta-feira, 30 de março de 2011

Auto-numeração em colunas (IDENTITY) - Parte 2

No último artigo, explorei os aspectos básicos relacionados às colunas auto-numeráveis, neste artigo, aprofundaremos em algumas propriedades e funções relacionadas a este tipo de coluna

Recuperando o valor gerado para uma coluna auto incrementável em uma tabela

Existem situações onde é necessário recuperar o valor gerado pela coluna auto incrementável, ao inserir registros em tabelas relacionadas através de um campo deste tipo, por exemplo.

Para realizar esta tarefa, o SQL Server disponibiliza algumas funções de sistema:
  • @@IDENTITY - Retorna o último valor gerado para o campo IDENTITY independente do escopo, ou seja, se o comando INSERT disparar uma Trigger que realize um novo INSERT sobre esta tabela, a função @@IDENTITY retornará o último valor gerado.
  • SCOPE_IDENTITY() - Retorna o último valor gerado para o campo IDENTITY no escopo atual, ou seja, se o comando INSERT disparar uma Trigger que realize um novo INSERT sobre esta tabela, a função SCOPE_IDENTITY() retornará o valor gerado inicialmente.

  • IDENT_CURRENT( 'tableName' ) - Retorna o último valor gerado para a tabela cujo nome deve ser passado por parâmetro. O valor retornado é independente de escopo ou sessão.

No exemplo abaixo, recuperamos o último valor inserido no campo ID da tabela Pessoa utilizando a função @@IDENTITY:

CREATE TABLE Pessoa
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    nome VARCHAR(50)
)

INSERT INTO Pessoa VALUES ('Evandro')
INSERT INTO Pessoa VALUES ('Mariana')
INSERT INTO Pessoa VALUES ('Regina')
INSERT INTO Pessoa VALUES ('Antonio')

SELECT @@IDENTITY

Veja na figura abaixo o resultado da execução deste script:


Observe que ao consultar o valor de @@IDENTITY, foi retornado o último valor gerado para o campo ID.

As funções IDENT_CURRENT('tablename') e SCOPE_IDENT() podem ser utilizadas da mesma forma. Veja abaixo:

IDENT_CURRENT('tablename'):


SCOPE_IDENTITY():


Aguarde! No próximo artigo veremos como especificar os valores a serem inseridos em um campo IDENTITY e também como definir qual o próximo valor a ser gerado para a coluna.


quinta-feira, 24 de março de 2011

Auto-numeração em colunas (IDENTITY) - Parte 1

Encontrar uma coluna (ou algumas colunas) que identifique(m) unicamente as linhas de uma tabela (chave primária) nem sempre é uma tarefa trivial. 

Alguns tipos de registros possuem características que os distingem unicamente dos demais, como os casos abaixo:
Por outro lado, existem registros que necessitam de uma chave composta por várias colunas da tabela ou mesmo onde não se pode garantir que a combinação diferenciará uma linhas das demais.

Uma das maneiras de garantir a unicidade de um registro é utilizar um código identificador (ID) para os registros da tabela. Para isso, pode-se usar uma coluna auto-numerável, cujo valor nunca se repete entre duas linhas.

A propriedade IDENTITY

A grande maioria dos SGBDs populares possuem o recurso de auto-numeração para colunas, como é o caso das SEQUENCES para Oracle, ou da propriedade AUTO_INCREMENT para o MySQL.

O SQL Server disponibiliza a propriedade IDENTITY para as colunas do tipo inteiro, permitindo a criação de uma coluna auto-numerável.

Algumas condições devem ser observadas para trabalhar com esta propriedade:
  • Apenas colunas do tipo INT, TINYINT, SMALLINT e BIGINT podem ser autonumeráveis
  • Somente uma única coluna pode ser autonumerável em uma tabela

Criando uma coluna IDENTITY

Para criar uma coluna com a propriedade IDENTITY, é necessário especificar um valor para o início da contagem e um valor de incremento, normalmente utiliza-se o valor 1 para ambos os parâmetros.

Veja o exemplo abaixo:

CREATE TABLE Pessoa 
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    nome VARCHAR(50)
)

No script acima, criou-se uma tabela para armazenar Pessoas. O campo id será preenchdio automaticamente, iniciando em 1 para o 1º registro, 2 para o 2º registro e assim em diante.

Inserindo registros em uma tabela com coluna IDENTITY

Em condições normais, não é necessário especificar valores para o campo IDENTITY. Veja como os dados são inseridos na tabela Pessoa
 
INSERT INTO Pessoa VALUES ('Evandro')
INSERT INTO Pessoa VALUES ('Mariana')
INSERT INTO Pessoa VALUES ('Regina')
INSERT INTO Pessoa VALUES ('Antonio')

Veja o resultado da consulta em nossa tabela:


Observe que não foi necessário inserir os valores para a coluna ID.

Em breve, publicarei alguns recursos para manipular colunas com a  propriedade IDENTITY.


terça-feira, 15 de março de 2011

AdventureWorks para o SQL Server Denali CTP1

A Microsoft já liberou uma release beta da base de dados Adventure-Works para testes.

Esta release é baseada na base de dados disponibilizada com o SQL Server 2008 R2, contendo atualizações referentes as novas funcionalidades do SQL Server Denali CTP1

Assim como as versões anteriores, o download pode ser feito através do Codeplex, comunidade OpenSource da Microsoft.

Segue abaixo o link para o download:

quarta-feira, 9 de março de 2011

Junções entre tabelas (JOINS)

Uma das dificuldades dos iniciantes na linguagem SQL é a construção de consultas utilizando junções entre tabelas, um recurso fundamental para visualizar os dados de um banco relacional.

Ao juntar as linhas de duas tabelas A e B, o SQL Server tenta combinar cada linha de A com todas as linhas de B, seguindo um critério estabelecido ao criar a junção (cláusula ON). Assim, serão retornadas todas as associações válidas da linha de A com as linhas de B, podendo haver mais do que uma correspondência em B para cada linha de A.

O resultado de uma junção pode ser utilizado para retornar os dados para um usuário ou aplicação,  mas também pode ser referenciado em uma consulta como uma nova tabela, permitindo que novas junções e filtros sejam realizados sobre este sub-resultado. Além disso, pode-se selecionar colunas específicas de cada tabela participante de uma junção ou mesmo não retornar colunas de uma tabela.

Para exemplificar, utilizaremos duas tabelas temporárias muito simples com apenas uma coluna do tipo inteiro em cada uma.

-- Criando tabela A
CREATE TABLE #a (id int)  

-- Criando tabela B
CREATE TABLE #b (id int)

E popularemos estas tabelas com alguns dados para testarmos as junções:

-- Populando tabela A
INSERT INTO #a VALUES (1)
INSERT INTO #a VALUES (2)

-- Populando tabela B
INSERT INTO #b VALUES (1)
INSERT INTO #b VALUES (3)

Desta forma, nossas tabelas para testes serão:

#A
#B
id id
1 1
2 3

Nos scripts de exemplo, utilizarei Alias para aumentar a legibilidade.

INNER JOIN

A junção mais utilizada para explorar os relacionamentos em tabelas é o INNER JOIN. Através desta junção, são retornadas todas as linhas das tabelas A e B que correspondam ao critério estabelecido na cláusula ON.

Podemos juntar os dados de nossas tabelas #a e #b utilizando o comando abaixo:

SELECT * FROM #a A
INNER JOIN #b B
   ON A.id = B.id

O resultado desta consulta está na figura abaixo:


Observe que o SQL Server retornou apenas as linhas que correspondem ao critério da cláusula ON.

LEFT JOIN

Um outro tipo de junção disponível na linguagem T-SQL é o LEFT JOIN. Ao juntar a tabela A com a tabela B utilizando o LEFT JOIN, todas as linhas de A serão retornadas, mesmo que não seja encontrada uma linha em B que atenda ao critério de alguma linha em A.

Se uma linha da tabela A não estiver associada a uma linha da tabela B e o resultado da consulta apresentar colunas da tabela B, estas colunas serão retornadas com o valor NULL para esta linha.

Abaixo, temos o comando para realizar um LEFT JOIN entre nossas tabelas de teste:

SELECT * FROM #a a
LEFT JOIN #b b
   ON a.id = b.id

Verifique o resultado da consulta na figura abaixo:


Observe que o SQL Server retornou todas as linhas da tabela A. Para a coluna pertencente à tabela B, só foram preenchidas com dados as linhas onde o critério definido na cláusula ON foi atendido.

Outro aspecto importante é a ordem das tabelas participantes do LEFT JOIN. Serão retornadas todas as linhas da primeira tabela, e apenas as linhas de B que atendam ao critério da junção.

RIGHT JOIN

O RIGHT JOIN é muito semelhante ao LEFT JOIN. A diferença fundamental é que serão retornadas todas as linhas da segunda tabela participante da junção.

O comando abaixo define uma consulta utilizando o RIGHT JOIN para juntar os dados de nossas tabelas de teste:

SELECT * FROM #a a
RIGHT JOIN #b b
   ON a.id = b.id

Veja o resultado:


Observe que o SQL Server retornou todas as linhas da tabela B. Para a coluna pertencente à tabela A, só foram preenchidas com dados as linhas onde o critério definido na cláusula ON foi atendido.

Assim como no LEFT JOIN, a ordem das tabelas participantes é importante e pode alterar o resultado de um RIGHT JOIN

FULL JOIN

O funcionamento do FULL JOIN pode ser considerado uma combinação do LEFT JOIN e o RIGHT JOIN, ou seja, quando se realiza uma junção entre duas tabelas A e B através do FULL JOIN, obtém-se como resultado uma combinação das linhas de A e B que respeitam a condição definida na cláusula ON e também farão parte do resultado as linhas de ambas as tabelas que não foram associadas.

Vejamos na prática. O comando abaixo realiza o FULL JOIN entre as tabelas que criamos para testar as junções:

SELECT * FROM #a a
FULL JOIN #b b
   ON a.id = b.id

A figura abaixo exibe o resultado deste comando:


CROSS JOIN

O CROSS JOIN diferencia-se dos outros tipos de junção, pois não permite que seja especificada uma condição para a junção (Cláusula ON). Assim, o resultado será uma combinação de TODAS as linhas da primeira tabela com TODAS as linhas da segunda tabela.

Esse é um dos tipos de junção menos utilizados, talvez pelo risco apresentado ao combinar duas tabelas com muitos registros ou mesmo por não permitir a criação de uma condição de junção, o que não é interessante para explorar dados relacionais.

O comando abaixo realiza o CROSS JOIN entre nossas tabelas de teste:

SELECT * FROM #a
CROSS JOIN #b

Observe que não há filtro. Define-se apenas quais tabelas participarão da junção. O resultado este comando é exibido na figura abaixo:


No resultado acima, verificamos que cada linha da tabela #a foi combinada com uma linha da tabela #b, não houve filtros ou restrições.

É preciso ter cuidado ao utilizar CROSS JOIN, pois devido à ausência de condições de junção, seu resultado pode apresentar um número muito grande de linhas (o número de linhas do resultado será sempre igual à multiplicação do número de linhas das tabelas participantes), o que pode causar impactos na performance do processamento, leitura e escrita em disco (I/O) e também gerar um grande tráfego na rede onde se localiza a instância do SQL Server.

SELF JOIN

Algumas pessoa costumam dar o nome de SELF JOIN para as junções onde uma tabela é associada a ela mesma. Todas as junções descritas acima podem ser utilizadas para realizar um SELF JOIN.

ALGUMAS DICAS...

  • Procure criar índices para os campos utilizados com frequencia para realizar junções, garantindo assim uma performance maior no processamento das junções.
  • Evite utilizar o CROSS JOIN. Ele pode impactar seriamente no desempenho de seu servidor SQL Server.