Segunda-feira, 24 de setembro de 2001 às 01h59

Dicas Gerais

Faltam -1 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

Pessoal, na coluna desta semana vou colocar algumas dicas gerais para quem trabalha com SQL Server.

Vamos lá:

Registros Aleatórios

Vamos supor que queremos retornar 10 registros aleatórios de uma tabela. Como podemos fazer isto?

A partir do SQL Server 7.0, foi implementada uma uma função chamada NEWID(). Esta função gera um identificador interno aleatório. Para retornar registros aleatórios, podemos fazer assim:

SELECT TOP 10 CAMPO1 , CAMPO2 FROM TABELA1
ORDER BY NEWID()

Para cada registro, um valor aleatório diferente é gerado. A ordem do resultado é feita por este valor e a cada execução temos 10 registros diferentes, pois a cláusula TOP limita a quantidade de registros retornados.

Instruções dinâmicas

O SQL Server permite a construção de instruções dinâmicas a partir do comando EXECUTE(). Funciona assim: montamos uma string com o comando que queremos executar dinamicamente e chamamos a função EXECUTE(). Atenção: neste caso , devemos obrigatoriamente utilizar os parênteses:

EXECUTE("SELECT CAMPO 1 FROM TABELA1 WHERE CAMPO2 = 3")

Valor de campo e filtro condicional

Nem sempre queremos mostrar o conteúdo de um campo do jeito que ele está armazenado no banco. Por exemplo: Se o conteúdo de um campo for maior que 10, queremos que seja retornada a string 'muito'. Se for menor ou igual a 10 retorna 'pouco'.

Fazemos isto utilizando um CASE (estrutura condicional, como um IF de uma linguagem de programação) para o conteúdo do campo:

SELECT CAMPO1 , TIPO = CASE WHEN CAMPO_VALOR > 10 THEN 'MUITO'
WHEN CAMPO_VALOR <= 10 THEN 'POUCO'
END , CAMPO3
FROM TABELA1

Para cada registro o SQL Server fará uma comparação para identificar qual valor deve ser retornado. Tome cuidado ao utilizar o CASE desta maneira pois pode haver perda de performance na instrução por que a cada linha retornada, um pequeno processamento deve ser efetuado.

Podemos também utilizar o CASE para um filtro da instrução (cláusula WHERE):

SELECT CAMPO1 , CAMPO2 FROM TABELA1
WHERE CAMPO2 > CASE CAMPO1 WHEN 'A' THEN 10
WHEN 'B' THEN 5 END

No exemplo acima, quando o valor do CAMPO1 for igual a 'A', somente os registros do CAMPO2 que forem maiores que 10 serão retornados. Quando o valor do CAMPO1 for igual a 'B', somente os registros do CAMPO2 que forem maiores que 5 serão retornados.

Leitura Seqüencial

O SQL Server permite uma leitura seqüencial, ou seja ler um registro por vez, através do uso de cursores. Por favor, não confundam estes cursores com os da sua aplicação (ASP , VB , PHP , Java , etc). Este cursores são somente do banco de dados e não podem ser utilizados fora dele.

Como este tipo de processamento é efetuado linha a linha, recomenda-se que não utilize muito, pois tem uma perda de performance considerável. Abaixo temos um exemplo de um cursor para uma da tabela com dois campos:

-- Cria as variáveis que irão armazenar o conteúdo dos campos
-- Devem ser do mesmo tipo dos campos da tabela
DECLARE @CAMPO1 VARCHAR(10)
DECLARE @CAMPO2 INT

-- Declara um cursor para uma instrução SELECT
DECLARE CUR_TMP CURSOR FOR
SELECT CAMPO1,CAMPO2 FROM TABELA1

-- Abre o curosr
OPEN CUR_TMP

-- Pula para o próximo registro preenchendo as variáveis
FETCH NEXT FROM CUR_TMP INTO @CAMPO1,@CAMPO2

-- Loop: enquando não acabar os registros
WHILE @@FETCH_STATUS = 0
BEGIN

-- Mostra na tela o conteudo do CAMPO1 e do CAMPO2
SELECT @CAMPO1 , @CAMPO2

-- Pula para o próximo registro preenchendo as variáveis
FETCH NEXT FROM CUR_TMP INTO @CAMPO1,@CAMPO2
END

-- Fecha o cursor
CLOSE CUR_TMP

-- Desaloca a memória do cursor
DEALLOCATE CUR_TMP

Registros afetados

Sempre que enviamos uma instrução para o SQL Sever utilizando o Query Analyzer, obtemos uma mensagem que mostra quantos registros foram afetados para a instrução que acabamos de enviar ao banco, como: (1 row(s) affected).

Para evitar que esta mensagem não seja mais retornada, utilize o comando SET NOCOUNT ON. Para voltar a apresentar esta mensagem, utilize o SET NOCOUNT OFF. Esta configuração é válida somente durante o período que se está conectado ao banco.

Agora, se quisermos limitar quantas linhas uma instrução pode afetar, devemos utilizar o SET ROWCOUNT. Exemplo:

-- A partir deste comando, somente os dois primeiros registros serão afetados
SET ROWCOUNT 2

-- Atualiza os dados
UPDATE TABELA1 SET CAMPO2=0

-- Volta a configuração: sem limites de registros a serem afetados por qualquer instrução
SET ROWCOUNT 0

Utilize este comando com muito cuidado e procure sempre voltar o valor de SET ROWCOUNT para o seu valor anterior, para evitar problemas.

Por hoje é só pessoal. Qualquer dúvida que vocês tiverem, por favor me enviem por e-mail que eu terei prazer em respondê-la.

Um abraço para todos e até a semana que vem.

1 comentário

 Lawrence Carvalho
02/12/2004 10h52

Isnull

Complementando: Um tipo especial de case é a função isnull que compara se um valor é nulo e substitui por outro valor definido pelo usuário, p. ex.: select isnull(@Valor, 0). Se valor for nulo, o retorno será 0, caso contrário será o próprio valor da variável @valor.

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Mauro Pichiliani é mestre em computação, possui as certificações MCP, MCDBA, MCT e MCTS e atua como consultor de banco de dados com enfoque na área de tunning.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.