Trabalhando com Cursores em MS-SQL Server.
Postado em : 21/08/2018
Quando estamos trabalhando com STORED PROCEDURES
, muitas vezes temos a necessidade de fazer uma leitura e processar seus registros lendo linha a linha até o final da tabela. Vamos lá entender como podemos fazer esta operação em MS-Sql.
Para evitar erros quando estamos trabalhando com diversos cursores podemos executar a seguinte função para verificar se o cursor esta aberto e se sim executar o procedimento para fechar (CLOSE
) e liberar a memoria (DEALLOCATE
), conforme o exemplo abaixo:
IF (CURSOR_STATUS('global','curr')>=-1) BEGIN CLOSE curr DEALLOCATE curr END
O próximo passo é declarar nosso cursor
DECLARE curr CURSOR FOR
Agora vamos carregar os dados e abrir nosso cursor, abaixo temos o exemplo de um SELECT
, declarando as variaveis e carregando os dados no cursor com o comando FETCH
:
-- Select SELECT id, nome, idgrupo FROM tblclientes c WHERE c.idgrupo > 0 -- Declarando as variáveis para carregar os dados DECLARE @id INT DECLARE @nome VARCHAR(50) DECLARE @idgrupo INT -- Abrindo o Cursor OPEN curr -- Posiciona os dados do registro atribuindo as variáveis FETCH NEXT FROM curr INTO @id, @nome, @idgrupo
em seguida faremos o LOOP
de leitura de nosso de nossos dados utilizando o cursor:
-- While WHILE @@FETCH_STATUS = 0 BEGIN -- faça o tratamento dos dados aqui.... UPDATE tblclientes SET soma = soma + 1 WHERE id = @id -- Movimenta o ponteiro dos dados para o próximo registro e carrega as variáveis FETCH NEXT FROM curr INTO @id, @nome, @idgrupo END
Após finalizarmos nosso LOOP
de leitura e tratamento dos dados fechamos nosso cursor e liberamos a memoria:
CLOSE curr DEALLOCATE curr
Nossa estrutura completa completa ficaria assim:
IF (CURSOR_STATUS('global','curr')>=-1) BEGIN CLOSE curr DEALLOCATE curr END DECLARE curr CURSOR FOR -- Select SELECT id, nome, idgrupo FROM tblclientes c WHERE c.idgrupo > 0 -- Declarando as variáveis para carregar os dados DECLARE @id INT DECLARE @nome VARCHAR(50) DECLARE @idgrupo INT -- Abrindo o Cursor OPEN curr -- Posiciona os dados do registro atribuindo as variáveis FETCH NEXT FROM curr INTO @id, @nome, @idgrupo -- While WHILE @@FETCH_STATUS = 0 BEGIN -- faça o tratamento dos dados aqui.... UPDATE tblclientes SET soma = soma + 1 WHERE id = @id -- Movimenta o ponteiro dos dados para o próximo registro e carrega as variáveis FETCH NEXT FROM curr INTO @id, @nome, @idgrupo END -- Fechando nosso cursor CLOSE curr DEALLOCATE curr
Links Relacionados
- Aula 11 - Acessando Banco de Dados SQL SERVER - Criando Consultas em sua aplicação em Asp.Net MVC 4 com C#(CSharp)
- Aula 12 - MS SQL Server - Comandos SQL e Stored Procedures em sua aplicação em Asp.Net MVC 4 com C#(CSharp)
- Aula 15 - Download das ferramentas necessárias para o nosso curso de Asp.Net MVC 4 com C#(CSharp)
- Aula 16 - Criando o banco de dados e configurando o SQLServer para nosso curso de Asp.Net MVC 4 com C#(CSharp)
- Aula 17 - Criando o banco de dados e configurando o SQLServer EXPRESS para nosso curso de Asp.Net MVC 4 com C#(CSharp)
- Classe para fazer Conexão MS SqlServer em C#(CSharp)
- Comando NULLIF no SQLServer.
- Consulta SQLServer com paginação
- Criando Tabelas Temporarias em MS-SqlServer
- Curso Instalando e configurando o MS SQL Server Express 2014 e Management Studio 2014
- DELETE CASCADE no SqlServer
- Desvendando o Poder da Função STRING_AGG no SQL Server para concatenação de dados
- DROP TABLE IF EXISTS no SQL Server.
- Exemplo de acesso a dados com SQL Server em C#.
- Exemplo de consulta em SqlServer para encontrar uma chave Estrangeira
- Exemplo de Stored Procedure com tratamento de erros e transação. (SqlServer)
- Exemplos de Stored Procedure SQL Server
- Explorando Tipos de Dados Personalizados no SqlServer: Utilidade e Impacto na Performance
- Extensões para DataReader, tratando valores de suas consultas SQL (DataReaderExtensions) C#(CSharp)
- Fazendo a paginação de consultas em MySQL com o comando Limit e Offset
- Formatando datas SqlServer
- Função para gerar tabela com listagem contendo intervalo entre duas datas. (SqlServer)
- MS SQL Server Express 2014 e Management Studio 2014 - Download e Intalação
- Não consigo apagar um Banco de dados (can not drop database) - MS-SQL Server.
- Quando utilizar NOLOCK e READPAST no SqlServer.
- Restaurando um Banco de dados quando este fica travado informando estar restaurando, MS-SQL Server.
- Rodando Script MS-SQL Server diretamente pela linha de comando
- Salvando CSV com cabeçalho no SQL Server Management Studio
- Tratando colunas nulas em sua Query SqlServer
- Update/Delete com INNER em MS-SQL Server
- Validando Valores nulos vindos de nosso Banco de Dados C#(CSharp)