Dica – Respeitando a precedência de operadores no SQL Server

Dica – Respeitando a precedência de operadores no SQL Server.

Anúncios

Salve comunidade, tudo bem?

A dica de hoje tem a finalidade de ilustrar algo que normalmente não se preocupamos muito e que por diversos motivos pode se passar despercebido. Estou me referindo a Precedência de Operadores Transact-SQL utilizados no SQL Server.

Não estou somente me referindo as operadores matemáticos, mas sim a todos os operadores que podem ser utilizados em querys, scripts, atividades administrativas, entre outros.

Os operadores são classificados e definidos em níveis de precedência e relavância, algo que representa ao SQL Server uma possível ordem de análise e execução. Para ilustrar melhor esta ordem de precedência e níveis, apresenta abaixo a Tabela 1.

Nível

Operadores

1

~ (Não de bit a bit).

2

* (Multiplicação), / (Divisão),% (Módulo).

3

+ (Positivo), – (Negativo), + (Adição), +  (Concatenar) – (Subtração) & (AND de bit a bit), ^ (OR Exclusivo de bit a   bit), | (OR de bit a bit).

4

=, >, <, >=, <=, <>, !=, !>,  !< (Operadores de comparação).

5

NOT

6

AND

7

ALL, ANY, BETWEEN, IN, LIKE, OR, SOME

8

= (Atribuição).

Tabela 1 – Relação de operadores, níveis de precedência e descrição.

Observações: Uma expressão reconhecida pelo SQL Server como complexa, pode conter vários operadores, isso indica a análise da precedência de operador determina a seqüência na qual as operações são executadas. A ordem de execução pode afetar o valor resultante significativamente. Um operador em níveis superiores é avaliado antes de um operador em um nível inferior.

Quando dois operadores em uma expressão tiverem o mesmo nível de precedência de operador, eles serão avaliados da esquerda para a direita em sua posição na expressão.

Para ilustrar este comportamento, apresenta o Exemplo 1 a seguir:

— Exemplo 1: Expressão utilizando operadores de mesmo nível —

DECLARE @MyNumber int

SET @MyNumber = 4 – 2 + 27 — Operadores de mesmo nível declarados na instrução —

SELECT @MyNumber

Como já foi destacado, a ordem de declaração dos operadores poderá gerar impactos e mudanças nos resultados gerados pelo SQL Server, para evitar possíveis mudanças nos resultados, indico a utilização de parênteses para substituir a precedência definida dos operadores em uma expressão. Tudo que estiver entre parênteses é avaliado primeiro para gerar um único valor antes daquele que poderá ser usado por qualquer operador fora dos parênteses.

Para ilustrar este cenário, apresento a seguir o Exemplo 2.

— Exemplo 2: Utilizando parênteses em instruções com operadores do mesmo nível —

DECLARE @MyNumber int

SET @MyNumber = 2 * 4 + 5

SELECT @MyNumber

Na instrução apresentada anteriormente, a expressão usada na seguinte instrução SET, o operador de multiplicação tem uma precedência maior que o operador de adição. Portanto, ele é avaliado primeiro; o resultado da expressão é 13. Neste caso o resultado desta instrução esta incorreto, para corrigir esta pequena falha adicionamos o parênteses, conforme apresenta a seguir:

DECLARE @MyNumber int

SET @MyNumber = 2 * (4 + 5) — Adicinando os parênteses para auxiliar na definição de precedência e ordem de execução —

SELECT @MyNumber

Após adicionarmos os parênteses o SQL Server, irá realizar uma nova análise e definição da ordem de precedência e execução dos operadores, neste caso, será realizado primeiro a adição dos valores e depois a multiplicação, gerando como resultado o número 18.

Para finalizar, vamos analisar uma instrução com parênteses aninhados. Se uma expressão tiver parênteses aninhados, a expressão mais aninhada será avaliada primeiro. O Exemplo 3 apresentado a seguir contém parênteses aninhados, com a expressão 5 – 3 no conjunto de parênteses mais aninhado. Essa expressão gera um valor de 2. Em seguida, o operador de adição (+) adiciona esse resultado a 4. Isso gera um valor de 6. Finalmente, os 6 são multiplicados por 2 para gerar um resultado de expressão de 12.

— Exemplo 3: Utilizando parênteses aninhados em uma instrução —

DECLARE @MyNumber int

SET @MyNumber = 2 * (4 + (5 – 3) )

SELECT @MyNumber

Bom pessoal, vou encerrar esta dica, espero que todos possam ter gostado e entendido a importância em se analisar a precedência dos operadores em suas instruções.

Agradeço mais uma vez a sua visita, nos encontramos em breve.

Até mais.

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP - Faculdade de Informática e Administração Paulista de São Paulo. Pós-Graduado em Gestão da Tecnologia da Informação Faculdade - ESAMC Sorocaba. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1995 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator - Administrador de Banco de Dados - SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, Triggers. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping. Atualmente trabalho como Administrador de Banco de Dados no FIT - Instituto de Tecnologia da Flextronics, como também, Consultor em Projetos de Tunnig e Performance para clientes, bem como, Professor Titular na Fatec São Roque. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Possuo titulação Oficial Microsoft MVP - SQL Server renovada desde 2007.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s