Das ist nur dokumentiertes Verhalten. Ich glaube nicht, dass irgendjemand die Einstellungen durcheinander gebracht hat.
Siehe Datentypvorrang in MSDN.
Wenn ein Operator zwei Ausdrücke verschiedener Datentypen kombiniert, geben die Regeln für die Vorrangstellung der Datentypen an, dass der Datentyp mit der niedrigeren Vorrangstellung in den Datentyp mit der höheren Vorrangstellung konvertiert wird.
Wie in den Kommentaren angegeben, wird die leere Zeichenfolge in einem beliebigen numerischen Typ in 0 und in 1900-01-01 00: 00: 00.000 konvertiert, wenn sie in ein Datum konvertiert wird.
EDIT: Ich denke, Ihr eigentliches Problem ist, dass Ihr Design so ist, dass Sie Felder eines anderen Datentyps zusammenfügen müssen. Die einzige Möglichkeit, dies zu umgehen, besteht darin, eine Konvertierung für Ihre Join-Klausel vorzunehmen, die die Abfrageleistung beeinträchtigt. Das Hauptproblem liegt wahrscheinlich beim Schemaentwurf
EDIT: Es gab eine Menge Diskussionen in den Kommentaren, die in den Chat verschoben wurden. So unlogisch es auch erscheinen mag, wenn Sie eine leere Zeichenfolge in einen anderen Datentyp konvertieren, erhalten Sie beliebige Werte.
Dieser Code:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Erzeugt diese Ausgabe:
0
0
1900-01-01
1900-01-01 00:00:00.000
Sie könnten dann erwarten, dass dieses Verhalten zwischen anderen vorhergehenden Datentypen konsistent ist, und erwarten, dass das Konvertieren von 0 in ein Datum denselben willkürlichen Wert erzeugt, dies jedoch nicht.
SELECT CONVERT(date, 0)
Produziert
Eine explizite Konvertierung von Datentyp int nach date ist nicht zulässig.
Weil es keine unterstützte Konvertierung ist
während
SELECT CONVERT(datetime, 0)
Kehrt zurück
01. Januar 1900 00:00:00
Also ja, es ist seltsam und willkürlich, aber tatsächlich dokumentiert und erklärbar.
CAST('' AS INT)
-> 0 irgendwo dokumentiert? Es wäre schön, wenn Sie Verweis hinzufügen.