Comparar o SQL do Access com o TSQL do SQL Server

Aplica-se A
Access para Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

Se migrar os dados do Access para SQL Server ou criar uma solução do Access com SQL Server como base de dados de back-end, é fundamental que saiba as diferenças entre o SQL do Access e SQL Server Transact SQL (TSQL). O que se segue são as diferenças importantes que precisa de ter em conta para que a sua solução funcione conforme pretendido.

Para obter mais informações, veja Access SQL: basic concepts, vocabulário, and syntax and Transact-SQL Reference (SqL do Access: conceitos básicos, vocabulário e sintaxe ) e Transact-SQL Reference (Referência do Transact-SQL).

Diferenças de sintaxe e de expressões

Existem algumas diferenças na sintaxe e em expressões que requerem conversão. A tabela seguinte resume as mais comuns.

Diferença SQL do Access TSQL do SQL Server
Atributo da base de dados relacional Normalmente denominado campo Normalmente denominado coluna
Cadeias de caracteres literais Aspas ("), como em " Mary Q. Contrary" Apóstrofe ('), como em 'Mary Q. Contrary'
Datas literais Símbolo cardinal (#), como em #01/01/2019# Apóstrofe ('), como em "01/01/2019"
Carácter universal múltiplo Asterisco (*), tal como em "Cath *" Símbolo percentual (%), tal como em 'Cath%'
Carácter universal único Ponto de Interrogação (?), como em "Cath?" Símbolo de sublinhado (_), como em "Cath_"
Operador de resto Operador MOD, como em Value1 MOD Valor2 Percentagem (%), como em Valor1 % Valor2
Valores booleanos WHERE Bitvalue = [True | False]
Ou
WHERE Bitvalue = [-1 | 0]
WHERE Bitvalue = [1 | 0]
Parâmetros [<Um nome que não é uma coluna> definida]
Ou
Na vista SQL, utilize a Declaração de Parâmetros do SQL
@ParamName

Notas

  • No Access, nomes de tabelas e objetos vêm entre aspas (“). Com o T-SQL pode utilizar aspas para os nomes de tabelas que contenham espaços, mas esta não é uma prática de designação padrão. Na maioria dos casos, os nomes de objetos devem ser alterados para nomes que não contenham espaços mas, neste caso, as consultas também têm de ser reescritas para refletir os novos nomes das tabelas. Utilize parênteses [ ] para tabelas que não podem ser renomeadas, mas que não estão em conformidade com os padrões de nomenclatura. O Access também adiciona parênteses adicionais em torno de parâmetros nas consultas mas, com o T-SQL, estes podem ser removidos.

  • Pondere utilizar o formato de data canónico, aaaa-mm-dd hh: hh:mm:ss, que é um padrão ODBC para datas armazenadas como carateres, e que fornece uma forma consistente de representa-las em bases de dados preservando a sequência de ordenação das datas.

  • Para evitar confusão ao comparar valores Booleanos, pode utilizar a seguinte comparação para o Access e para o SQL Server:

    • Testar o valor falso WHERE Bitvalue = 0
    • Testar o valor verdadeiro WHERE Bitvalue <> 0

Valores nulos

Um valor nulo não é um campo vazio que significa "nenhum valor". Um valor nulo é um marcador de posição que indica que os dados estão em falta ou são desconhecidos. Os sistemas de bases de dados que reconhecem valores nulos implementam "lógica de três valores", o que significa que algo pode ser verdadeiro, falso ou desconhecido. Se não processar corretamente valores nulos, pode obter resultados incorretos ao fazer comparações de igualdade ou avaliar cláusulas WHERE. Segue-se uma comparação de como o Access e o SQL Server tratam valores nulos.

Desativar valores nulos numa tabela

No Access e no SQL Server, os valores nulos estão ativados por defeito. Para desativar os valores nulos numa coluna de uma tabela, faça o seguinte:

  • No Access, altere a propriedade Necessário de um campo para Sim.
  • No SQL Server, adicione o atributo NOT NULL a uma coluna numa instrução CREATE TABLE.

Testar se existem valores nulos numa cláusula WHERE

Compare utilizando É NULO e NÃO É NULO:

  • No Access, use É NULO ou NÃO É NULO. Por exemplo:

    SELECT … WHERE column IS NULL.
    
  • No SQL Server, use IS NULL ou IS NOT NULL. Por exemplo:

    SELECT … WHERE field IS NULL
    

Converter valores nulos usando funções

Utilize as funções nulas para proteger as suas expressões e devolver valores alternativos:

  • No Access, utilize a função NZ (variante, [valorsenulo]) que retorna 0 ou outro valor. Por exemplo:

    SELECT AVG (NZ (Weight, 50) ) FROM Product
    
  • No SQL Server, utilize a função ISNULL (valor, valor_substituição) que devolve 0 ou outro valor. Por exemplo:

    SELECT AVG (ISNULL (Weight, 50)) FROM Product
    

Compreender as opções da Base de Dados

Alguns sistemas de base de dados têm mecanismos registados:

  • No Access, não existem opções de base de dados que digam respeito aos valores Nulos.
  • No SQL Server pode utilizar a opção SET ANSI_NULLS OFF para comparações de igualdade direta com NULL com os operadores = e <> . Recomendamos que evite utilizar esta opção, uma vez que esta foi descontinuada, podendo confundir outras pessoas que dependam do tratamento de nulos compatível com a norma ISO.

Conversão e coerção

Sempre que está a trabalhar com dados ou com programação, há uma necessidade persistente de efetuar conversões de um tipo de dados para outro. O processo de conversão pode ser simples ou complexo. Os problemas comuns que precisa considerar são: conversão implícita ou explícita, as definições regionais de data e hora, arredondamento ou truncamento de números, e tamanhos de tipos de dados. Não há nenhum substituto para testes minuciosos e confirmação dos seus resultados.

No Access, pode usar as Funções de Conversão de Tipo, das quais existem onze, cada uma começando com a letra C, uma para cada tipo de dados. Por exemplo, para converter um número de vírgula flutuante numa cadeia de caracteres:


CStr(437.324) returns the string "437.324".

No SQL Server, utiliza principalmente as funções CAST e CONVERT TSQL, embora existam outras Funções de Conversão para necessidades especializadas. Por exemplo, para converter um número de vírgula flutuante numa cadeia de caracteres:


CONVERT(TEXT, 437.324) returns the string "437.324"

Funções SomData, DateDiff e PartData

Estas funções de data frequentemente utilizadas são semelhantes (SomData, DateDiff e PartData) no Access e no TSQL, diferindo na utilização do primeiro argumento.

  • No Access, o primeiro argumento é denominado intervalo e é uma expressão de cadeia que requer aspas.

  • No SQL Server, o primeiro argumento chama-se datepart e utiliza valores de palavra-chave que não necessitam de aspas.

    Componente Access SQL Server
    Ano "aaaa" ano, aa, aaaa
    Trimestre “t” trimestre, tt, t
    Mês "m" mês, mm, m
    Dia do Ano "a" diadoano, da, a
    Dia "d" dia, dd, d
    Semana “ss” sm, ss
    Dia da Semana "w" dia útil, s
    Hora "h" hora, hh
    Minuto "n" minuto, mi, n
    Segundo "s" segundo, ss, s
    Milissegundo milissegundo, ms

Comparação de funções

As consultas do Access podem conter colunas calculadas que, por vezes, utilizam Funções do Access para obter resultados. Ao migrar consultas para o SQL Server, tem de substituir a função Access por uma função TSQL equivalente, se essa função estiver disponível. Se não existir uma função TSQL correspondente, normalmente pode criar uma coluna calculada (o termo TSQL utilizado para uma coluna calculada) para fazer o que pretende. O TSQL tem uma vasta gama de funções e é do seu benefício ver o que está disponível. Para obter mais informações, veja O que são as funções da base de dados SQL?.

A tabela seguinte lista quais funções do Access têm uma função correspondente em TSQL.

Categoria do Access Função do Access Função do TSQL
Conversão Função Car CHAR
Conversão Função Dia DIA
Conversão Função FormatoNúmero FORMATAR
Conversão Função FormatoPercentagem FORMATAR
Conversão Função Cad STR
Conversão Funções de Conversão de Tipo CAST e CONVERTER
Data/Hora Função Data CURRENT_TIMESTAMP
Data/Hora Função Dia DATEFROMPARTS
Data/Hora Função SomData DATEADD
Data/Hora Função DifData DATADIFF
DATEDIFF_BIG
Data/Hora Função PartData DATEPART
Data/Hora Função DataSerial DATEFROMPARTS
Data/Hora Função ValorData DATENAME
Data/Hora Função Hora TIMEFROMPARTS
Data/Hora Função Minuto TIMEFROMPARTS
Data/Hora Função Mês MÊS
Data/Hora Função Agora SYSDATETIME
Data/Hora Função Segundo TIMEFROMPARTS
Função Tempo TIMEFROMPARTS
Data/Hora Função SerieHora TIMEFROMPARTS
Data/Hora Função Dia.Semana DATEPART
DATENAME
Data/Hora Função Ano ANO
DATEFROMPARTS
Agregação de Domínio Funções DPrimeiro, DÚltimo FIRST_VALUE
LAST_VALUE
Matemática Função Abs ABS
Matemática Função Atg ATAN
ATN2
Matemática Função Cos COS
ACOS
Matemática Função Exp EXP
Matemática Funções Int, Corrigir ARRED.DEFEITO
Matemática Função Log LOG
LOG10
Matemática Função Aleatório ALEATÓRIO
Matemática Função Arredondado ARRED
Matemática Função Snl SINAL
Matemática Função Sen SEN
Matemática Função Rqd RAIZQ
Fluxo de Programa Função Escolha SELECIONAR
Fluxo de Programa Função Ise IIF
Estatística Função Média AVG
Agregar do SQL Função Contar COUNT
COUNT_BIG
Agregar do SQL Funções Mínimo, Máximo MIN
MAX
Agregar do SQL Funções 'DesvP', 'DesvPP' DESVPAD
DESVPADP
Agregar do SQL Função Soma SOMA
Agregar do SQL Funções Var, VarP VAR
VARP
Text Função Formatar FORMATAR
Text Função Minúscula LOWER
Text Função Esquerda ESQUERDA
Text Função Compr NÚM.CARA
Text Funções SuprEsq, SuprDir e SuprEspaço TRIM
LTRIM
RTRIM
Text Função Substituir SUBSTITUIR
Text Função Direita À DIREITA
Text Função StrReverse INVERTER
Text Função Maiúscula UPPER