A documentação da Microsoft indica que a função REPLACE() aceita e retorna apenas tipos de dados de caracteres. No entanto, estes funcionam sem erros:
SELECT REPLACE(123456, 'X', 'Y')
;
SELECT REPLACE(CAST(123456 AS INT), 'X', 'Y')
;
Além disso, você pode tratar o resultado como um INT, sugerindo que a função reteve o tipo de dados do argumento sem tentar convertê-lo:
SELECT REPLACE(123456, 'X', 'Y') / 3
;
O que não está sendo declarado na documentação da Microsoft?
Para adicionar ao que Erik afirmou em seu comentário, não importa qual tipo de dados você deseja definir explicitamente seu parâmetro, a definição do argumento dentro da
REPLACE()
função é definida para receber um arquivostring_expression
.Isso significa que ele converterá implicitamente o parâmetro em um tipo de dados baseado em string, independentemente. Esse tipo de dados depende do que foi realmente passado - o SQL Engine tem alguma lógica e uma hierarquia que segue sobre o que pode ser implicitamente convertido para outro tipo, que provavelmente segue este gráfico de conversão de tipo de dados :
Se você tentasse um tipo incompatível que não pudesse ser convertido implicitamente, como um
XML
objeto, obteria um erro com aREPLACE()
função.