Vamos lá:
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.
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”)
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.
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
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.

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.
Responder comentárioOs textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
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.