Aprendendo a usar CURSOR – SQL Server

Boa noite!

Depois de um tempo se escrever é bom voltar a publicar algo um pouco mais substancial, hehehe…

Não gosto do consumo de processamento que eles geram, mas são muito úteis e bastante poderosos na manipulação de dados. Nesse primeiro momento não vou me aprofundar em CURSORES, mas apresentá-lo aqueles que estão iniciando no Microsoft SQL Server.

O que é CURSOR?

De maneira direta e simplista é uma espécie de ponteiro que nos ajuda a manipular e exibir dados consultados.

Como funciona?

Para entender é interessante um método de dividir como um cursor é declarado e o que ele faz. Segue abaixo:

1. Declara CURSOR (DECLARE)

2. Abre o CURSOR (OPEN)

3. Alimenta variáveis com os dados do CURSOR (FETCH)

4. Fecha e desaloca o CURSOR (CLOSE e DEALLOCATE)

<‘o’> Simples assim? Simples assim.

Vamos para um exemplo prático. Vou utilizar uma tabela cliente cujo o código de criação segue abaixo:

–Código de criação da tabela CLIENTE e alguns INSERTS só para exemplificar o CURSOR

create table CLIENTE
(
CodigoCliente int null,
NomeCliente varchar(50) null
)
go

insert into CLIENTE values (1,’Cliente 1′)
insert into CLIENTE values (2,’Cliente 2′)
insert into CLIENTE values (3,’Cliente 3′)
insert into CLIENTE values (4,’Cliente 4′)
insert into CLIENTE values (5,’Cliente 5′)

Agora vou utilizar o cursor fazer uma manipulação “inútil” para exibir os dados. É somente didática. Não serve de muita coisa, pois sem CURSOR seria imensamente fácil fazê-la. Vou utilizar nos comentários os passos que indiquei a vocês anteriormente para que fique mais fácil a compreensão:

–1. Declara CURSOR (DECLARE)
declare c_aprendendoCursor cursor for
select
CodigoCliente,
NomeCliente
from
CLIENTE

–2. Abre o CURSOR (OPEN)
open c_aprendendoCursor

–3. Alimenta variáveis com os dados do CURSOR (FETCH)
declare @cod int
declare @nome varchar(50)

fetch next from c_aprendendoCursor into @cod, @nome

print ‘Código do Cliente: ‘ + cast(@cod as varchar)
print ‘Nome do Cliente: ‘ + @nome
print ‘————————————————————————————‘

fetch next from c_aprendendoCursor into @cod, @nome

print ‘Código do Cliente: ‘ + cast(@cod as varchar)
print ‘Nome do Cliente: ‘ + @nome
print ‘————————————————————————————‘

fetch next from c_aprendendoCursor into @cod, @nome

print ‘Código do Cliente: ‘ + cast(@cod as varchar)
print ‘Nome do Cliente: ‘ + @nome
print ‘————————————————————————————‘

fetch next from c_aprendendoCursor into @cod, @nome

print ‘Código do Cliente: ‘ + cast(@cod as varchar)
print ‘Nome do Cliente: ‘ + @nome
print ‘————————————————————————————‘

–4. Fecha e desaloca o CURSOR (CLOSE e DEALLOCATE)
close c_aprendendoCursor
deallocate c_aprendendoCursor

Lembrando para quem já usa CURSOR que esse é um exemplo bem simplista! Por isso não vou me deter explicando maiores detalhes do CURSOR e nem sobre WHILE e @@FETCH_STATUS, etc, etc, etc…

Serão cenas do próximo capítulo! Rs

Espero que tenha sido útil. Até a próxima!

Anúncios

#Problemas para #pesquisar textos que possam conter #acentos errados? #Collations do #SQLServer resolverão seu problema

Fazia um bom tempo que não postava, porque estou me preparando para a prova 70-450 ( MCITP SQL Server 2008 – Implementation & Maintenance).

Mas hoje me sobrou algum tempo e decidi postar algo muito útil; porém, ainda pouco utilizado (pelo menos pelos locais onde tenho passado): Collations.

COLLATION

Definindo de uma forma bem básica, é um conjunto de regras sobre um determinado conjunto de caracteres baseado principalmente em idiomas. Para você entender melhor pense na língua portuguesa e suas regras e agora imagine regras na escrita alemã ,ou na japonesa, ou ainda na árabe. São totalmente diferentes e precisam ser tratadas diferentes no armazenamento e na busca. Para que isso seja possível existem os Collations.

Mas não posso ser tão simplista e deixar de comentar que as Collations também podem controlar detalhes da forma de pesquisar, como: sensibilidade à maiúsculas ou não, sensibilidade à acentos ou não, etc).

Para entender melhor como escolher um collation para a coluna do seu banco de dados, vamos analisar como é a nomeclatura dos Collations. Por exemplo, um dos Collations mais utilizados no Brasil: SQL_Latin1_General_CP1_CI_AI.

Para maior didática, vou dividir o nome da Collation da seguinte forma:

SQL_Latin1_General_ -> É o nome

CP1_ ->Significa que vai usar Unicode para codificação e ordenamento (não vou falar muito, pois não será o foco hoje)

CI_ -> Case Insensitive, ou seja, não sensível a maiúsculas e minúsculas. Se aqui tivesse CS, então seria Case Sensitive, ou seja, sensível a maiúsculas e minúsculas

AI_ ->Accent Insensitive, ou seja, não sensível à acentos. Se aqui tivesse AS, então seria Accent Sensitive, ou seja, sensível a acentos

E ainda existem outras partes da nomeclatura, mas para as língua latinas não vão importar; portanto, não vou me alongar nesse assunto.

 

Para examinar outras collations você pode executar a seguinte consulta que vai retornar o nome da Collation e a descrição:

select * from fn_helpcollations()

NA PRÁTICA

Para ficar mais fácil o entendimento sobre Collations vou usar uma solução de um problema recente na empresa em que trabalho.

Os usuários estavam cadastrando nomes de pessoas e colocavam acento no nome e outros não, gerando duplicidade e inconsistência no banco de dados. Por exemplo, um usuário cadastrava “João da Silva” e outro cadastrava “Joao da Silva”. Estamos falando da mesma pessoa; porém dois registros foram inseridos porque a Collation utilizada era a SQL_Latin1_General_CP1_CI_AS, que é sensível à acentos, sendo assim, considera os dois nomes diferentes.

A solução foi alterar a Collation do campo em questão para usar a SQL_Latin1_General_CP1_CI_AI (que não é sensível ao acento). Usei a seguinte query:

ALTER TABLE [dbo].[tb_cliente]
ALTER COLUMN [nm_cliente] varchar(50) collate SQL_Latin1_General_CP1_CI_AI not null

Pronto, agora ninguém mais conseguirá cadastrar “Joao da Silva” e depois “João da Silva”, pois isso ocasionará um erro devido a esse campo ser Unique. E ao consultar, tanto faz escrever “Joao” como “João”, o SQL Server retornará o usuário em questão.

CUIDADOS

Só lembrando dos cuidados que se deve ter ao modificar um collate:

  • verificar se o campo participa de algum índice (clustered ou nonclustered)
  • verificar se a modificação não vai gerar conflito de chave primária ou estrangeira e nestes casos, verificar qual o registro correto e qual pode ser excluído

 

Por hoje é só, caros leitores…

Hoje é sexta e é dia de curtir a esposa e uma boa comida.

Até o próximo post!

Fredy Esmeraldo

Implementation & Maintenance