Considere esta definição de tabela:
CREATE TABLE [dbo].[Post]
(
[Id] INT IDENTITY(1,1) NOT NULL,
[PostType] VARCHAR(10) NOT NULL,
CONSTRAINT [CK_Post_PostType] CHECK ([PostType] IN ('Question', 'Answer', 'Comment'))
)
Se eu executar isso e depois olhar em sys.check_constraints
:
select [definition]
from sys.check_constraints
where [name] = 'CK_Post_PostType';
Esta é a saída:
([PostType]='Comment' OR [PostType]='Answer' OR [PostType]='Question')
Então, mudou minha declaração "in" para uma série de declarações "ou".
O mesmo vale para (pelo menos)
BETWEEN
(é alterado paraOR
declarações) eCAST
(é alterado paraCONVERT
).
Percebo que isso não é um problema funcional no SQL Server, pois as expressões são logicamente equivalentes. Mas isso causa problemas com ferramentas de comparação de esquema como SSDT, porque o código-fonte está fora de sincronia com o código implantado. Eu escrevi no blog com mais detalhes sobre o problema aqui: Problemas de SSDT: implantando a mesma alteração repetidamente
Existe um nome para esse processo/comportamento de conversão? Existe alguma documentação para as diferentes conversões que podem ocorrer, para que possamos planejá-las (ou tentar evitá-las)?
Em termos gerais, isso é conhecido como padronização ou normalização .
Exemplos disso incluem (para expressões) Forma Normal Conjuntiva e Forma Normal Disjuntiva .
Não há documentação da Microsoft que eu conheça que liste todas as etapas dos vários processos envolvidos. Essencialmente, o SQL Server converte as coisas em um formato padrão para facilitar o trabalho interno. Isso ocorre em vários momentos, inclusive durante a análise e o estágio de normalização da compilação e otimização da consulta.
No que diz respeito ao
CAST
versusCONVERT
, pode ser simplesmente queCONVERT
foi o primeiro (e/ou porque oferece um superconjunto de funcionalidades). Você deve descobrir que as funções internas (intrínsecas) são geralmente preferidas.