Questo è solo un comportamento documentato. Non credo che nessuno abbia incasinato le impostazioni.
Vedere la precedenza del tipo di dati su MSDN.
Quando un operatore combina due espressioni di diversi tipi di dati, le regole per la precedenza del tipo di dati specificano che il tipo di dati con la precedenza inferiore viene convertito nel tipo di dati con la precedenza più alta.
Come notato nei commenti, la stringa vuota viene convertita in 0 in qualsiasi tipo numerico e in 1900-01-01 00: 00: 00.000 quando viene convertita in una data.
EDIT: penso che il tuo vero problema sia che il tuo design è tale che devi unirti a campi di un diverso tipo di dati. L'unico modo per aggirare il problema è di eseguire una conversione nella clausola di join che comprometterà le prestazioni della query. Il problema principale è probabilmente con la progettazione dello schema
EDIT: C'è stata molta discussione nei commenti che sono stati spostati in chat. Per quanto illogico possa sembrare, la conversione di una stringa vuota in altri tipi di dati produce valori arbitrari.
Questo codice:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Produce questo output:
0
0
1900-01-01
1900-01-01 00:00:00.000
Potresti quindi aspettarti che questo comportamento sia coerente tra altri tipi di dati precedenti e che la conversione di 0 in una data produrrebbe lo stesso valore arbitrario, ma non lo è.
SELECT CONVERT(date, 0)
produce
La conversione esplicita dal tipo di dati int ad oggi non è consentita.
Perché non è una conversione supportata
mentre
SELECT CONVERT(datetime, 0)
ritorna
01 gennaio 1900 00:00:00
Quindi sì, è strano e arbitrario, ma in realtà documentato e spiegabile.