2009-02-02 1 views
1

J'utilise MS SQL Server 2005 (9.0.4035) et j'essaie de trouver des lignes contenant les mêmes données dans un champ nvarchar (4000). Le champ contient xml qui a à la fois des parenthèses carrées d'ouverture et de fermeture.

sont des données échantillon Ici:
DataID données
3 2]
4 2]
5 3 [
6 3 [
Champ de comparaison MS SQL 2005 contenant une parenthèse carrée

Utilisation de la 'similaires' opérateur je m'attendais à obtenir 3 paires, mais mon problème est que les lignes 5 et 6 ne correspondent pas, je ne récupère que les lignes 1 & 2 match, et 3 & 4 match. Je sais que MS SQL 2005 a ajouté le support d'expression régulière dans les requêtes mais je ne m'attendais pas à ce qu'ils évaluent les données de champ comme une expression régulière, ce que je pense faire. Y at-il un mode que je dois activer pour obtenir les bons résultats?

Toute aide appréciée,
Ryan

Edit: Ajouté instruction SQL utilisée:

Sélectionnez t1.DataID, t2.DataID De TestTable t1, t2 TestTable
Où t1.DataID < > t2.DataID
et t1.Data comme t2.Data

Edit: Réponse
L'utilisation de l'opérateur '=' fonctionne, mais l'échappement de '[' ne fonctionne pas.

+0

Pouvez-vous ajouter la déclaration que vous avez essayé, afin que nous puissions avoir une meilleure prise sur votre problème? –

Répondre

3

Modifier votre requête pour utiliser = au lieu de LIKE et vous obtiendrez les résultats que vous attendez. SQL 2005 T-SQL ne fera pas de regex - vous aurez besoin d'utiliser les fonctions CLR pour cela - mais le statut LIKE fera la correspondance de modèle. '[' et ']' sont réservés pour la correspondance de modèle dans une déclaration similaire, et vous devrez leur échapper si vous vouliez qu'ils soient des correspondances d'égalité.

Voir http://msdn.microsoft.com/en-us/library/ms179859.aspx pour plus d'informations sur l'instruction LIKE.

Chacune des 2 requêtes ci-dessous a résolu le problème dans mes tests ...

--using equals operator... 
Select t1.DataID, t2.DataID From TestTable t1, TestTable t2 
Where t1.DataID <> t2.DataID 
and t1.Data = t2.Data 

--using replace to add an escape character. 
Select t1.DataID, t2.DataID From TestTable t1, TestTable t2 
Where t1.DataID <> t2.DataID 
and t1.Data like REPLACE(t2.Data, '[', '\[') escape '\' 
+0

Merci, Scott en utilisant '=' fonctionne. Je pensais que j'avais déjà essayé, mais c'était vendredi après-midi alors c'était peut-être le problème. J'ai essayé d'échapper à ces valeurs aussi (en modifiant la valeur du champ) sans aucune chance. L'utilisation de replace pour échapper les valeurs ne retourne pas non plus le résultat correct. –

+0

étrange que l'évasion n'a pas fonctionné pour vous - les deux requêtes ont travaillé sur ma boîte de développement standard SQL 2005. –