C'est juste un comportement documenté. Je ne pense pas que quiconque ait foiré les paramètres.
Voir la priorité du type de données sur MSDN.
Lorsqu'un opérateur combine deux expressions de types de données différents, les règles de priorité des types de données spécifient que le type de données avec la priorité la plus faible est converti en type de données avec la priorité la plus élevée.
Comme indiqué dans les commentaires, la chaîne vide est convertie en 0 dans n'importe quel type numérique et en 1900-01-01 00: 00: 00.000 lorsqu'elle est convertie en date.
EDIT: Je pense que votre vrai problème est que votre conception est telle que vous devez vous associer à des champs d'un type de données différent. La seule façon de contourner ce problème est d'avoir une conversion sur votre clause join qui nuira aux performances des requêtes. Le principal problème est probablement lié à la conception du schéma
EDIT: Il y a eu beaucoup de discussions dans les commentaires qui ont été déplacés vers le chat. Aussi illogique que cela puisse paraître, la conversion d'une chaîne vide en d'autres types de données produit des valeurs arbitraires.
Ce code:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Produit cette sortie:
0
0
1900-01-01
1900-01-01 00:00:00.000
Vous pouvez alors vous attendre à ce que ce comportement soit cohérent entre les autres types de données précédents et vous attendre à ce que la conversion de 0 en une date produise la même valeur arbitraire, mais ce n'est pas le cas.
SELECT CONVERT(date, 0)
Produit
La conversion explicite du type de données int à date n'est pas autorisée.
Parce que ce n'est pas une conversion prise en charge
tandis que
SELECT CONVERT(datetime, 0)
Résultats
01 janvier 1900 00:00:00
Alors oui, c'est bizarre et arbitraire, mais en fait documenté et explicable.
CAST('' AS INT)
-> 0 est-il documenté quelque part? Ce serait bien si vous ajoutez une référence.