sexta-feira, 26 de outubro de 2012

TOP dinâmico, usando SET ROWCOUNT

veremos como utilizar a função ROWCOUNT para realizar uma consulta com a quantidade de retorno de registros de forma dinâmica, definindo o quantidade de retorno de linhas por uma varável

definindo banco de dados para teste
--definindo banco de dados para teste
                use pubs;


select comum com o uso do TOP fixo
--select comum com o uso do TOP fixo
                select top 10 * from authors


caso tentarmos passar a quantidade a ser usada pelo TOP por uma variável, o sql server não aceita
declare @top int
                set @top = 3
                select top @top * from authors


ao executar a linha acima é retornado o seguinte erro:
Quote
Server: Msg 170, Level 15, State 1, Line 9
Line 9: Incorrect syntax near '@top'.


para contornar o erro acima poderiamos usar o EXEC e deixar a query em string, mas desta forma a execução perde performance (nada de anormal, mas perde)
declare @top int
                set @top = 3
                exec ('select top ' + @top + ' * from authors')



Uma forma de conseguir o mesmo resultado sem usar o EXEC seria com o comando SET ROWCOUNT, ao setar o ROWCOUNT, são afetados somente as quantidades de registros definida para os comandos SELECT, DELETE, INSERT e UPDATE 
E com o ROWCOUNT tem-se a opção de ser passado a quantidade por variável

exemplo:
declare @top int
           set @top = 3
           
           set rowcount @top
           
           --somente serão retornados 3 registros
           select * from authors



testando no update:
--adicionando uma coluna de testes na tabela authors, seu valor padrão ficará como NULL
  alter table authors add ColunaTeste char(1)
  
  --definindo quantidade de registros a serem processados
  declare @top int
  set @top = 3
           
  set rowcount @top
           
  --fazendo update, repare que esta sem WHERE, mas serão executados somente 3 registros
  update authors set ColunaTeste = 'x'



para voltar a quantidade de registros a serem processados para o normal, ou seja, todos, basta setar o ROWCOUNT para ZERO (0)
set rowcount 0
  select * from authors

verifique que na nossa coluna de testes, somente foram processados no update 3 registros

para remover a coluna de testes
alter table authors drop column ColunaTeste



AUTOR: "eriva_br"

Dúvidas, criticas, contribuições, correções e adições seram bem vindas.

Nenhum comentário:

Postar um comentário