Clause SQL where correspondance des valeurs avec des espaces
Dans SQL Server 2008, j'ai une table appelée Zone
avec une colonne ZoneReference varchar(50) not null
en tant que clé primaire.
Si j'exécute la requête suivante:
select '"' + ZoneReference + '"' as QuotedZoneReference
from Zone
where ZoneReference = 'WF11XU'
J'obtiens le résultat suivant:
"WF11XU "
Note l'espace de fin.
Comment est-ce possible? Si l'espace de fin est vraiment, là, sur cette ligne, alors je m'attends à le retourner zéro résultats, donc je suis en supposant que c'est quelque chose d'autre que SQL Server Management Studio affiche bizarrement.
Dans le code C# appelant zoneReference.Trim()
l'enlève, ce qui suggère qu'il est une sorte de caractère d'espacement.
Peut aider quelqu'un?
Vous devez vous connecter pour publier un commentaire.
C'est le résultat attendu: dans SQL Server le
=
opérateur ignore les espaces de fin lors de la prise de la comparaison.Source
WHERE ZoneReference = 'WF11XU' AND DATALENGTH(ZoneReference) = DATALENGTH('WF11XU')
travaillera aussi et peut-être plus rapide queLIKE
where 'WF11XU' like ZoneReference
et ça a fonctionné! Plus étrange et le plus bizarre. Pourtant, chaque jour est un jour d'école!Espaces ne sont pas toujours ignoré.
J'ai connu ce problème aujourd'hui. Ma table avait colonnes NCHAR et a été rejoint de données VARCHAR.
Parce que les données dans la table n'était pas aussi large que dans son domaine, des espaces ont été ajoutés automatiquement par SQL Server.
J'ai eu un ITVF (fonction table en ligne) qui a eu varchar paramètres.
Les paramètres ont été utilisés dans une JOINTURE de la table avec la NCHAR champs.
Les jointures ont échoué parce que les données transmises à la fonction n'ont pas d'espaces, mais les données dans la table de fait. Pourquoi était-ce?
J'ai été faire trébucher sur la PRIORITÉ des types de DONNÉES. (Voir http://technet.microsoft.com/en-us/library/ms190309.aspx)
Lors de la comparaison des chaînes de différents types, la priorité inférieure est converti à la priorité plus élevée de type avant la comparaison. Donc, mon VARCHAR paramètres ont été convertis en NCHARs. Le NCHARs ont été comparés, et apparemment, les espaces ont été importants.
Comment ai-je résoudre ce problème? J'ai changé la définition de la fonction à utiliser NVARCHAR paramètres, qui sont d'une priorité plus élevée que NCHAR. Maintenant, le NCHARs ont été modifiés automatiquement par SQL Server dans NVARCHARs et les espaces ont été ignorés.
Pourquoi n'ai-je pas simplement effectuer une RTRIM? Les tests ont révélé que RTRIM tué la performance, de la prévention de la JOINTURE des optimisations SQL Server, autrement, aurait utilisé.
Pourquoi ne pas changer le type de données de la table? Les tables sont déjà installés sur les sites des clients, et ils ne veulent pas exécuter les scripts de maintenance (temps + argent pour payer les Administrateurs de bases de données) ou de nous donner accès à leurs machinines (compréhensible).
Ouais, Marque est correct. Exécutez l'instruction SQL suivante:
Mais, de l'affirmation à propos de "like" déclaration semble ne pas travailler dans l'exemple ci-dessus. Sortie:
EDIT:
Pour le faire fonctionner, vous pourriez le mettre à la fin:
Laid si.
EDIT2:
Compte tenu des commentaires abovem, la suivante devrait fonctionner:
essayer
where
clause à la hauteur de ce dossier.