Preciso de ajuda para descobrir por que a seguinte T-SQL
declaração retorna 1
(verdadeiro):
SELECT IIF( 0 = '', 1, 0)
Acho que alguém mudou uma ANSI
opção como SET ANSI_NULLS
ou outra coisa que está causando o comportamento.
Meu problema é que estou juntando alguns valores e no conjunto de linhas final tenho valores que são unidos por 0
e ''
valores, o que não está correto.
Isso é apenas um comportamento documentado. Acho que ninguém mexeu nas configurações.
Consulte a precedência de tipo de dados no MSDN.
Conforme observado nos comentários, a string vazia é convertida em 0 em qualquer tipo numérico e em 1900-01-01 00:00:00.000 quando convertida em uma data.
EDIT: Acho que seu problema real é que seu design é para que você precise ingressar em campos de um tipo de dados diferente. A única maneira de contornar isso é converter sua cláusula de junção, o que prejudicará o desempenho da consulta. O principal problema é provavelmente com o design do esquema
EDIT: Houve muita discussão nos comentários que foram movidos para o chat. Por mais ilógico que pareça, converter uma string vazia em outros tipos de dados produz valores arbitrários.
Este código:
Produz esta saída:
Você poderia esperar, então, que esse comportamento seja consistente entre outros tipos de dados anteriores e esperar que a conversão de 0 em uma data produzisse o mesmo valor arbitrário, mas isso não acontece.
produz
Porque não é uma conversão suportada
enquanto
devoluções
Então, sim, é estranho e arbitrário, mas na verdade documentado e explicável.