To tylko udokumentowane zachowanie. Nie sądzę, żeby ktokolwiek pomieszał z ustawieniami.
Zobacz pierwszeństwo typu danych w MSDN.
Gdy operator łączy dwa wyrażenia różnych typów danych, reguły pierwszeństwa typu danych określają, że typ danych o niższym priorytecie jest konwertowany na typ danych o wyższym priorytecie.
Jak zauważono w komentarzach, pusty ciąg znaków jest konwertowany na 0 w dowolnym typie numerycznym i na 1900-01-01 00: 00: 00.000 po konwersji na datę.
EDYCJA: Myślę, że twoim prawdziwym problemem jest to, że twój projekt jest taki, że musisz dołączyć do pól innego typu danych. Jedynym sposobem obejścia tego problemu jest konwersja klauzuli łączenia, co wpłynie negatywnie na wydajność zapytań. Głównym problemem jest prawdopodobnie projekt schematu
EDYCJA: W komentarzach, które zostały przeniesione na czat, była wiele dyskusji. Jakkolwiek nielogiczne może się to wydawać, konwersja pustego łańcucha na inne typy danych generuje dowolne wartości.
Ten kod:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Daje to wyjście:
0
0
1900-01-01
1900-01-01 00:00:00.000
Można się zatem spodziewać, że to zachowanie jest spójne między innymi poprzednimi typami danych i oczekiwać, że konwersja 0 na datę da tę samą dowolną wartość, ale nie jest.
SELECT CONVERT(date, 0)
Produkuje
Jawna konwersja z typu danych int na datę jest niedozwolona.
Ponieważ nie jest to obsługiwana konwersja
podczas
SELECT CONVERT(datetime, 0)
Zwroty
1 stycznia 1900 00:00:00
Tak, to dziwne i arbitralne, ale faktycznie udokumentowane i możliwe do wyjaśnienia.
CAST('' AS INT)
-> 0 jest gdzieś udokumentowane? Byłoby miło dodać referencję.