Sei que os tipos de dados NUMERIC e DECIMAL no SQL Server funcionam da mesma maneira: 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 o relacionamento entre os dois como este:
numérico é funcionalmente equivalente a decimal.
Normalmente, quando vejo o qualificador " funcionalmente equivalente", isso 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 NUMÉRICO e DECIMAL que se comportam da mesma forma com um observador externo? Ou eles são realmente equivalentes, por exemplo, NUMERIC é apenas um sinônimo herdado de DECIMAL?
fonte
Respostas:
Na verdade, são equivalentes, mas são tipos independentes e não são sinônimos tecnicamente , como
ROWVERSION
eTIMESTAMP
- embora possam ter sido referidos como sinônimos na documentação ao mesmo tempo . 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 da redação no MSDN é realmente:
Além dos
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 tratamos como 100% intercambiáveis.
Somente se você fizer isso explicitamente. Você pode provar isso facilmente criando uma tabela e depois 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 há conversões explícitas onde poderíamos tê-las esperado. 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 possui conversões (na verdade, a guia Expressões está vazia):
Mesmo estes não levam a conversões inesperadas. É claro que você o vê no RHS no predicado, mas em nenhum caso ocorreu nenhuma conversão nos 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".fonte
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 especificadas por
precision
escale
.22) DECIMAL especifica o tipo de dados numérico exato, com a escala decimal especificada pela precisão decimal definida
scale
pela implementação e igual ou maior que o valor especificadoprecision
.fonte