O exemplo básico de cursor consiste em uma repetição (loop) onde um mesmo conjunto de comandos é executado para todas as linhas do retorno de uma consulta.
No exemplo abaixo, utiliza-se um cursor para executar a chamada da procedure sp_helptext para cada procedure de um banco de dados. As procedures foram obtidas através de uma consulta na viewROUTINES do Schema INFORMATION SCHEMA.
DECLARE @schemaName VARCHAR(30)
, @procName VARCHAR(30)
, @fullName VARCHAR(60)
-- Cursor para percorrer os nomes dos objetos
DECLARE cursor_objects CURSOR FOR
SELECT
ROUTINE_SCHEMA
, ROUTINE_NAME
FROM
INFORMATION_SCHEMA.ROUTINES
WHERE
ROUTINE_TYPE = 'PROCEDURE'
-- Abrindo Cursor para leitura
OPEN cursor_objects
-- Lendo a próxima linha
FETCH NEXT FROM cursor_objects INTO @schemaName, @procName
-- Percorrendo linhas do cursor (enquanto houverem)
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @fullName = @schemaName + '.' + @procName
EXEC sp_helptext @fullName
-- Lendo a próxima linha
FETCH NEXT FROM cursor_objects INTO @schemaName, @procName
END
-- Fechando Cursor para leitura
CLOSE cursor_objects
-- Desalocando o cursor
DEALLOCATE cursor_objects
, @procName VARCHAR(30)
, @fullName VARCHAR(60)
-- Cursor para percorrer os nomes dos objetos
DECLARE cursor_objects CURSOR FOR
SELECT
ROUTINE_SCHEMA
, ROUTINE_NAME
FROM
INFORMATION_SCHEMA.ROUTINES
WHERE
ROUTINE_TYPE = 'PROCEDURE'
-- Abrindo Cursor para leitura
OPEN cursor_objects
-- Lendo a próxima linha
FETCH NEXT FROM cursor_objects INTO @schemaName, @procName
-- Percorrendo linhas do cursor (enquanto houverem)
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @fullName = @schemaName + '.' + @procName
EXEC sp_helptext @fullName
-- Lendo a próxima linha
FETCH NEXT FROM cursor_objects INTO @schemaName, @procName
END
-- Fechando Cursor para leitura
CLOSE cursor_objects
-- Desalocando o cursor
DEALLOCATE cursor_objects
Algumas considerações:
- Um cursor deve estar sempre associado a uma consulta, especificada ao declarar o cursor.
- O comando FETCH popula as variáveis recebidas como parâmetro com os valores da próxima linha da consulta a ser lida. O número de variáveis passadas como parâmetro deve ser igual ao número de colunas retornadas na consulta associada ao cursor.
- A variável global @@FETCH_STATUS retorna o resultado da última operação FETCH executada por um cursor na conexão.
O status 0 significa que o comando FETCH retornou uma linha, qualquer outro resultado significa que não houve linha retornada.
- Cursores são estruturas relativamente lentas se comparadas ao desempenho de consultas do banco. O uso descuidado dessa ferramenta pode causar sérios problemas de performance.
Referencia:
http://www.sqlserverdicas.com/2010/12/cursores-exemplo-basico-de-utilizacao.html
Nenhum comentário:
Postar um comentário