jueves, 28 de febrero de 2008

Evitar el uso del cursor

Una de las recomendaciones más tópicas a la hora de escribir scripts en T-SQL es la de eliminar el empleo de cursores siempre que sea posible.

Brad McGehee en sql-server-performance.com habla del tema. Y aunque menciona el uso de WHILE como alternativa al cursor no pone ningún modelo como ejemplo

Aquí va uno sencillo (simplemente toma los nombres de todas las bbdd del servidor y los muestra )

declare @loop int

create table #test (clave int identity(1,1) not null, dbname varchar (60))

insert into #test select name from master..sysdatabases

SET @loop = isnull((SELECT count(*) FROM #test),0)

SET @counter= 1

WHILE @loop >0 and @counter <=@loop

BEGIN

SELECT @dbname = rtrim(dbname) FROM #test

WHERE clave = @counter

print @dbname

SET @counter = @counter +1

END

Select * from #test

DROP TABLE #test

El mismo ejemplo pero usando cursor sería algo así:

declare @counter int

declare @dbname varchar (60)

create table #testcur (dbname varchar (60))

insert into #testcur select name from master..sysdatabases

declare dbcursor cursor for select dbname from #testcur

open dbcursor

fetch next from dbcursor into @dbname

while @@fetch_status = 0

begin

print @dbname

fetch next from dbcursor into @dbname

end

close dbcursor

deallocate dbcursor

drop table #testcur

1 comentario:

Edgar dijo...

quisiera saber como harias que se evalue el valor de un campo por cada registro para aplicarlo en un procedmiento almacenado, en cursores encontre un ejemplo pero la performance es muy deficiente.