web-dev-qa-db-fra.com

Pourquoi 0 est égal à une chaîne vide?

J'ai besoin d'aide pour savoir pourquoi l'instruction T-SQL Suivante renvoie 1 (Vrai):

SELECT IIF( 0 = '', 1, 0)

Je suppose que quelqu'un a changé une option ANSI comme SET ANSI_NULLS Ou quelque chose d'autre qui cause le problème.

Mon problème est que je joins certaines valeurs et que dans la dernière ligne, j'ai des valeurs qui sont jointes par des valeurs 0 Et '', Ce qui n'est pas correct.

23
gotqn

C'est juste un comportement documenté. Je ne pense pas que quiconque ait foiré les paramètres.

Voir 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 un conversion prise en charge

tandis que

SELECT CONVERT(datetime, 0)

Retour

01 janvier 1900 00:00:00

Alors oui, c'est bizarre et arbitraire, mais en fait documenté et explicable.