Eu sei que os tipos de dados NUMERIC e DECIMAL no SQL Server funcionam da mesma forma: a sintaxe para criá-los é a mesma, os intervalos de valores que você pode armazenar neles são os mesmos etc.
No entanto, a documentação do MSDN descreve a relação entre os dois assim:
numeric é funcionalmente equivalente a decimal.
Normalmente, quando vejo o qualificador " funcionalmente equivalente", significa que as duas coisas não são exatamente iguais, mas que são dois tipos diferentes que são indistinguíveis do lado de fora .
Essa implicação é verdadeira? Existem diferenças entre NUMERIC e DECIMAL que por acaso se comportam da mesma forma para um observador externo? Ou eles são realmente equivalentes, por exemplo, NUMERIC é apenas um sinônimo herdado para DECIMAL?
Eles são realmente equivalentes, mas são tipos independentes, e não tecnicamente sinônimos, como
ROWVERSION
eTIMESTAMP
- embora possam ter sido referidos como sinônimos na documentação uma vez . Esse é um significado ligeiramente diferente de sinônimo (por exemplo, eles são indistinguíveis exceto no nome, nenhum é um apelido para o outro). Irônico, certo?O que eu interpreto do texto no MSDN é na verdade:
Fora os
type_id
valores, tudo aqui é idêntico:Não tenho absolutamente nenhum conhecimento de diferenças comportamentais entre os dois e, voltando ao SQL Server 6.5, sempre os tratei como 100% intercambiáveis.
Somente se você fizer isso explicitamente. Você pode provar isso facilmente criando uma tabela e inspecionando o plano de consulta para consultas que executam conversões explícitas ou - você pode esperar - implícitas. Aqui está uma tabela simples:
Agora execute essas consultas e capture o plano:
Conforme mostrado no SQL Sentry Plan Explorer *, o plano não é realmente interessante:
Mas a guia Expressões com certeza é:
Como comentei acima, temos conversões explícitas onde pedimos, mas não temos conversões explícitas onde esperávamos. Parece que o otimizador também os está tratando como intercambiáveis.
Vá em frente e tente este teste também (dados e índices).
Agora execute esta consulta:
O plano não tem conversões (na verdade, a guia Expressões está vazia):
Mesmo estes não levam a conversões inesperadas. Claro que você vê isso no RHS no predicado, mas em nenhum caso qualquer conversão teve que ocorrer contra os dados da coluna para facilitar a busca (muito menos forçar uma varredura).
Pessoalmente, prefiro usar o termo
DECIMAL
apenas porque é muito mais preciso e descritivo.BIT
também é "numérico".Eles são idênticos na prática, no entanto (do padrão SQL 2003):
21) NUMERIC especifica o tipo de dados numérico exato, com a precisão decimal e a escala especificada por
precision
escale
.22) DECIMAL especifica o tipo de dados numérico exato, com a escala decimal especificada pelo
scale
e a precisão decimal definida pela implementação igual ou maior que o valor do especificadoprecision
.