Cursores são estruturas da linguagem T-SQL que permitem o processamento das linhas retornadas por uma consulta (SELECT), através de estruturas complexas de programação, como repetições ou comandos condicionais.
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 view ROUTINES do Schema INFORMATION SCHEMA.
Algumas considerações:
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 view ROUTINES 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.

