That is just documented behavior. I don't think anyone messed with the settings. See [data type precedence](https://msdn.microsoft.com/en-us/library/ms190309.aspx) on MSDN. > When an operator combines two expressions of different data types, the > rules for data type precedence specify that the data type with the > lower precedence is converted to the data type with the higher > precedence. As noted in the comments the empty string gets converted to 0 in any numeric type and to 1900-01-01 00:00:00.000 when converted to a date. EDIT: I think your real problem is that your design is so that you have to join on fields of a different data type. The only way to get around this is to have a convert on your join clause which will hurt query performance. The main problem is probably with the schema design EDIT: There was a lot of discussion in the comments that have been moved to chat. However illogical it may seem, converting an empty string to other data types produces arbitrary values. This code: SELECT CONVERT(int, '') SELECT CONVERT(float, '') SELECT CONVERT(date, '') SELECT CONVERT(datetime, '') Produces this output: 0 0 1900-01-01 1900-01-01 00:00:00.000 You could expect then that this behavior is consistent between other preceding datatypes and expect that converting 0 to a date would produce the same arbitrary value but it doesn't. SELECT CONVERT(date, 0) Produces > Explicit conversion from data type int to date is not allowed.